我正在读书https://stackoverflow.com/a/10010364/156458,并对-e
sed 的选项有疑问。
如果我是正确的,-e
则用于在内联 sed 命令之前。但我们可以指定一个不带 .sed 的内联 sed 命令-e
。例如,以下两个对我来说作用相同:
$ echo foo | sed 's/foo/bar/g'
bar
$ echo foo | sed -e 's/foo/bar/g'
bar
不需要-f
指定 sed 脚本。我们什么时候需要-e
?在开头给出的链接中的具体情况下,我们为什么需要-e
?
谢谢。
答案1
man sed
这在 sed ( )的手册页中得到了解答
-e script
,--expression=script
将脚本添加到要执行的命令中
和
如果没有给出
-e
,--expression
[...] 选项,则将第一个非选项参数作为sed
要解释的脚本。所有剩余参数都是输入文件的名称;如果未指定输入文件,则读取标准输入。
因此,如果只有一个参数,sed
它将被视为sed
脚本。如果您有多个参数,则应使用-e
或--expression
来确定哪个参数是sed
脚本。
在您的具体示例中,这两种选择是同义词。
答案2
当您想要将多个表达式作为代码传递时,您通常需要使用-e
(可能与 一起使用)。-f
sed
之后给出的表达式-e
和之后给出的文件内容-f
连接起来(使用换行符)以形成sed
脚本。当您只想传递一个文字表达式时,可以省略-e
并将该表达式作为第一个非选项参数传递给sed
。
sed -e s/foo/bar/ -f file.sed -e 'a\' -e foo
与执行相同:
sed 's/foo/bar/
content of file.sed
a\
foo'
由于有些地方(例如在w
//命令之后以及更多取决于实现的地方)您不能使用分隔命令,而有些地方您r
确实需要换行符(如上面的那样),因此使用多个s 是一种保留命令的方法一行命令(对于像这样的 shell 很有用,使得输入多行命令变得很尴尬,或者像这样的 shell 使得输入多行命令变得很尴尬)#
;
a
-e
sed
csh
ksh
编辑他们)。
如果是:
sed 's/foo/bar/g'
与
sed -e 's/foo/bar/g'
这完全没有区别。