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

sda*_*aau 7 shell sed

说我有这个文件:

cat > test.txt <<EOF
line one word
line two word
line three word
line one two word
EOF
Run Code Online (Sandbox Code Playgroud)

让我们说我想用'TWO'替换所有单词'two',在文件中就地内联 .test.txt

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

$ sed -n 's/two/TWO/gp' test.txt 
line TWO word
line one TWO word
Run Code Online (Sandbox Code Playgroud)

...然后我通常执行实际的就地替换(有-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
Run Code Online (Sandbox Code Playgroud)

有没有办法sed在一个文件中就地更改行,从一个命令行打印更改的行到stdout?

Jon*_*ler 9

在Linux上,您可以逃脱:

sed -i '/two/{s/two/TWO/g; w /dev/stdout}' test.txt
Run Code Online (Sandbox Code Playgroud)

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

sed -i '/two/{s/two/TWO/g; w /dev/stdout
       }' test.txt
Run Code Online (Sandbox Code Playgroud)

  • 太棒了 - 非常感谢@Jonathan Leffler!顺便说一句,我在Ubuntu 11.04上,第一个命令行给了我"`sed:无法打开文件/ dev/stdout}:Permission denied`"; 当我像你为Mac做的'stdout'之后我休息一下时,一切都很棒!再次感谢 - 欢呼! (3认同)