sed:同步替换,打印出更改的行?

时间:2011-11-23 02:57:36

标签: shell sed

说我有这个文件:

cat > test.txt <<EOF
line one word
line two word
line three word
line one two word
EOF

让我们说我想用文件test.txt中的'TWO', inline in 替换所有单词'two'。< / p>

现在,我所做的通常是构建一个“预览”(-n不打印行,然后使用/p - 仅打印匹配的行):

$ sed -n 's/two/TWO/gp' test.txt 
line TWO word
line one TWO word

...然后我通常执行实际的就地替换(使用-i,而不使用/p):

$ sed -i 's/two/TWO/g' test.txt
$ cat test.txt 
line one word
line TWO word
line three word
line one TWO word

有没有办法让sed同时更改文件中的行,从单个命令行将更改的行打印到stdout?

1 个答案:

答案 0 :(得分:8)

在Linux上,你可以逃脱:

sed -i '/two/{s/two/TWO/g; w /dev/stdout}' test.txt

在BSD系统(包括Mac OS X)上,sed有关于何时可以将动作组合到一行上的略微古怪的规则,我必须使用:

sed -i '/two/{s/two/TWO/g; w /dev/stdout
       }' test.txt