我找不到有关该sed
-e
开关的任何文档,对于简单的替换,我需要它吗?
例如
sed 's/foo/bar/'
VS
sed -e 's/foo/bar/'
答案1
从手册页:
-e script, --expression=script
add the script to the commands to be executed
因此,您可以使用多个-e
选项来构建由多个部分组成的脚本。
$ sed -e "s/foo/bar/" -e "/FOO/d"
首先替换foo
为bar
,然后删除包含 的每一行FOO
。
答案2
这可能对你有用:
sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file
在每种情况下,i
(插入)、a
(追加)和c
(更改)命令都需要以换行符终止。
;
通常命令可以用eg分隔/foo/d;/bar/d
并用{...
}eg分组/foo/{h;d}
,但对于i,a,c
命令来说,它-e
提供了一种分隔命令的方法。
另一种方法是使用 shell(bash) 插入换行符:
sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file
答案3
在帮助中sed
你会发现-e
flag代表:
-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
今天就可以开始使用该标志了。这样,将来您只需使用 .app 附加额外的脚本即可-e <script>
。
注意:在其他答案中,;
建议使用多个脚本作为替代方案。虽然在某些情况下这在技术上是可行的,但并不鼓励这样做,因为它很快就会导致代码非常难以阅读。请参阅此处的示例:https://www.grymoire.com/Unix/Sed.html#uh-61
答案4
-e
,相当于--expression
, 是可选的,除非您将多个表达式串在一起(不常见),如另一个中所示回答。
Aside:;
可以在同一个表达式中替代使用,以依次执行多个表达式。