我以为我理解了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)
你的表达几乎是正确的,但它有两个问题:
如果你想匹配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命令将连接why到hi,在模式空间中留下字符串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)