我以为我理解 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(使用前将#替换为@)