为什么sed';w';编辑命令是否截断文件而不是附加到文件?
我写了这个shell脚本为什么sed';w';编辑命令是否截断文件而不是附加到文件?,sed,Sed,我写了这个shell脚本 echo a: foo > a.txt echo a: bar >> a.txt echo a: baz >> a.txt sed -i -e '/bar/{ w b.txt' -e 'd }' a.txt sed -i -e '/baz/{ w b.txt' -e 'd }' a.txt cat b.txt 这是我得到的结果 a: baz 但我期待这个结果 a: bar a: baz 我期望得到这样的结果,因为: 由于它说“ap
echo a: foo > a.txt
echo a: bar >> a.txt
echo a: baz >> a.txt
sed -i -e '/bar/{ w b.txt' -e 'd }' a.txt
sed -i -e '/baz/{ w b.txt' -e 'd }' a.txt
cat b.txt
这是我得到的结果
a: baz
但我期待这个结果
a: bar
a: baz
我期望得到这样的结果,因为:
由于它说“append”,我假设第一个sed
命令将a:bar
附加到一个不存在的文件中,从而创建该文件。然后,第二个sed
命令将a:baz
附加到同一个文件中
但上面的结果表明情况并非如此
我的理解有什么错误?单个sed调用的所有写入命令都附加到同一个文件中。但是,每次新调用都会首先截断文件。您运行sed两次,每次对
w
的第一次(也是唯一一次)调用都会截断文件。要获得预期的输出,只需运行sed一次:
$ sed -i -e '/bar/{ w b.txt' -e 'd }' -e '/baz/{ w b.txt' -e 'd }' a.txt
$ cat b.txt
a: bar
a: baz
或使用更少的-e
:
sed -i '/bar\|baz/{
w b.txt
d
}' a.txt
与
\\\\
的交替是对基本正则表达式的GNU扩展,就像-i
也不是POSIX sed的一部分一样
sed -i '/bar\|baz/{
w b.txt
d
}' a.txt