sed命令中-e的作用是什么?


41

我找不到有关该sed -e交换机的任何文档,为进行简单更换,是否需要它?

例如

sed 's/foo/bar/'

VS

sed -e 's/foo/bar/'

14
您确定没有在其中找到这个man sed吗?

4
您找不到强大的解释,为什么不使用“ cmd1; cmd2”
用户未知,

Answers:


28

从手册页:

-e script, --expression=script

    add the script to the commands to be executed

因此,您可以使用多个-e选项从多个部分构建脚本。

$ sed -e "s/foo/bar/" -e "/FOO/d"

首先将替换foobar,然后删除包含的每一行FOO


3
因此,如果只有一个脚本,则不需要'-e',对吗?
JohnyTex

我也在寻找真正的目的-e
typelogic '18

27

这可能对您有用:

sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file

在每种情况下,i(插入),a(添加)和c(更改)命令都需要用换行符终止。

通常,命令可以用;例如分隔,/foo/d;/bar/d并用{...} 分组,例如,/foo/{h;d}但是对于i,a,c命令,-e它提供了一种分离命令的方式。

另一种方法是使用shell(bash)插入换行符:

sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file

1
在至少某些sed实现中(例如,在FreeBSD上),还需要使用换行符/ -e而不是分号来结束标签和分支命令。这将不起作用:sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm"。但这将是:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
dubiousjim 2012年

我不确定这must be terminated with a newline句话在这里有多必要。当我在自己的这里测试时cygwin,此方法有效:sed '/foo/i\bar' file。因此,既然我们可以将单独的表达式融合为一个,这又引出了最初的问题:的真正目的是-e什么?
typelogic

1

-e等效于--expression,是可选的,除非您将多个表达式串在一起(不常见),如另一个Answer中所示。

除了:;可以代替在同一表达式中使用,一个接一个地执行多个表达式。


0

在帮助中,sed您会发现该-e标志代表:

 -e script, --expression=script
                 add the script to the commands to be executed

但是,遇到相遇之后,您并不是第一个感到困惑的人-e。在你的榜样sed 's/foo/bar/'sed -e 's/foo/bar/'是等价的。在这两种情况下s/foo/bar/脚本都是由sed执行的。第二个选项更为明确,但这可能不是您经常看到-e使用的原因。这样做的原因是,-e可以通过调用多个使用多个脚本sed。这仍然留下一个问题,如果仅使用一个脚本,为什么要使用它呢?以下示例可能会说明这一点:

echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'

将输出“ foo”。

然而,

echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'

将失败,因为现在sed将第s/foo/bar一个解释为文件名。因此,为了让您的生活更轻松,您-e今天就可以开始使用该标志。这样,将来您可以使用来向命令附加一个额外的脚本-e <script>

注意在其他答案中;,建议使用替代方法来使用多个脚本。尽管在某些情况下从技术上讲这是可能的,但不建议这样做,因为它很快导致很难阅读代码。在此处查看示例:https : //www.grymoire.com/Unix/Sed.html#uh-61

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.