【问题标题】:sed: simultanous in-place replacement, and printout of changed lines?sed:同时就地替换和打印输出更改的行?
【发布时间】:2012-01-04 10:14:17
【问题描述】:

假设我有这个文件:

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

假设我想将文件test.txt中的所有单词“two”替换为“TWO”,inline in-place

现在,我所做的通常是构建一个“预览”(使用-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 在文件中就地更改行,从单个命令行将更改的行打印到标准输出?

【问题讨论】:

    标签: shell sed


    【解决方案1】:

    在 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
    

    【讨论】:

    • 太棒了-非常感谢@Jonathan Leffler!顺便说一句,我在 Ubuntu 11.04 上,第一个命令行给了我“sed: couldn't open file /dev/stdout}: Permission denied”;当我在stdout 之后休息时,就像你在 Mac 上所做的那样,一切都很好!再次感谢 - 干杯!
    • 为你们俩干杯——这也帮助了我!
    • FWIW,你说在 Mac OS X 上“sed 有一些古怪的规则”,实际上只是 OS X 使用 BSD sed,而不是 GNU sed,它们的工作方式有点不同。
    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 2019-10-13
    • 2017-01-06
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    相关资源
    最近更新 更多