使用 sed 替换多行

2024-06-23

我以为我理解 sed 但我想不是。我有以下两个文件,我想用一个不同的行替换“why”和“huh”行。根本没有空格。

测试.txt:

hi
why
huh
hi
why
huh

测试2.txt:

1
hi
why
huh
hi
why
huh

以下两个命令给出以下结果:

sed "N; s/<why\/>\n<huh\/>/yo/g" test.txt > out.txt

out.txt:
hi
why
huh
hi
yo

sed "N; s/<why\/>\n<huh\/>/yo/g" test2.txt > out2.txt

out2.txt:
1
hi
yo
hi
why
huh

我对 sed 有什么不明白的地方?为什么两个输出文件不包含以下内容:

hi
yo
hi
yo

你的表达几乎是正确的,但有两个问题:

  • 如果你想搭配why作为一个词,你应该把\< and \>周围。你确实把< and \/>周围。所以,第一个更正是:

    $ sed 'N; s/\<why\>\n\<huh\>/yo/g' test.txt
    
  • 但这也行不通:

    $ sed 'N; s/\<why\>\n\<huh\>/yo/g' test.txt
    hi
    why
    huh
    hi
    yo
    

    为什么它只替换第二对线?嗯,在第一行中,N命令将连接why to hi,离开在模式空间 https://stackoverflow.com/questions/5886564/what-actually-the-meaning-of-n-in-sed/5886784#5886784字符串hi\nwhy。该字符串与s///命令,因此仅打印该行。下次,你有字符串huh在模式空间中并连接hi到它。就在下一行你会看到why\nhuh在要替换的模式空间中。

    解决方案是仅当当前行是时才连接下一行why, 使用address http://www.gnu.org/software/sed/manual/html_node/Addresses.html /^why$/:

    $ sed '/^why$/ {N; s/\<why\>\n\<huh\>/yo/g}' test.txt
    hi
    yo
    hi
    yo
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 sed 替换多行 的相关文章

随机推荐