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

时间:2016-05-25 14:15:04

标签: 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

我期待这个输出,因为http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html说:

[2addr]w  wfile
    Append (write) the pattern space to wfile.

因为它说"追加",我假设第一个sed命令会将a: bar附加到不存在的文件,从而创建该文件。然后第二个sed命令会将a: baz附加到同一个文件中。

但上面的输出显示情况并非如此。

我的理解有什么问题?

2 个答案:

答案 0 :(得分:2)

你运行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的一部分一样。

答案 1 :(得分:0)

单个sed调用的所有写入命令都附加到同一文件。但是,每次新调用都会先截断文件。