我写了这个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
附加到同一个文件中。
但上面的输出显示情况并非如此。
我的理解有什么问题?
答案 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调用的所有写入命令都附加到同一文件。但是,每次新调用都会先截断文件。