使用sed替换多行

use*_*925 4 sed

我以为我理解了sed,但我猜不是.我有以下两个文件,其中我想用一个不同的行替换"why"和"huh"行.根本没有空格.

的test.txt:

hi
why
huh
hi
why
huh
Run Code Online (Sandbox Code Playgroud)

的test2.txt:

1
hi
why
huh
hi
why
huh
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我怎么不了解sed?为什么两个输出文件都不包含以下内容:

hi
yo
hi
yo
Run Code Online (Sandbox Code Playgroud)

bra*_*zzi 8

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

  • 如果你想匹配why的话,你应该把\<\>它周围.你没把刚才<\/>它周围.所以,第一次修正是:

    $ sed 'N; s/\<why\>\n\<huh\>/yo/g' test.txt
    
    Run Code Online (Sandbox Code Playgroud)
  • 但它也不会起作用:

    $ sed 'N; s/\<why\>\n\<huh\>/yo/g' test.txt
    hi
    why
    huh
    hi
    yo
    
    Run Code Online (Sandbox Code Playgroud)

    为什么它只替换第二对线?好吧,在第一行,N命令将连接whyhi,在模式空间中留下字符串hi\nwhy.该字符串与s///命令不匹配,因此只打印该行.下一次,您huh在模式空间中拥有字符串并连接hi到它.在下一行中,您将why\nhuh在模式空间中进行替换.

    解决方案是仅在当前行why使用以下地址 连接下一行/^why$/:

    $ sed '/^why$/ {N; s/\<why\>\n\<huh\>/yo/g}' test.txt
    hi
    yo
    hi
    yo
    
    Run Code Online (Sandbox Code Playgroud)