为什么sed';w';编辑命令是否截断文件而不是附加到文件?

为什么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

我写了这个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
我期望得到这样的结果,因为:

由于它说“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