awk/sed中如何替换整个单词?

3

假设我有一个这样的文件:

hello
bye
bye
asd
hello

我希望可以交换 你好再见 (这只是一个例子,请不要局限于这些词语)。

我已经尝试了以下方法:

sed -e 's/hello/bye/I g;s/bye/hello/I g' input.txt > output.txt

但是你可以想象,这只改变了“bye”成“hello”,而“hello”仍然没有改变。


1
这两个术语可以出现在同一行吗? - log0
https://unix.stackexchange.com/questions/21061/cleanly-swap-all-occurences-of-two-strings-using-sed - log0
如果您的实际问题与所给示例基本相同,并且两个术语可以出现在同一行中,则请执行三个步骤:hello->newbye,bye->hello,newbye->bye。 - Tom Regner
1
我应该补充说明,每行只有一个术语。@TomRegner你的想法可能可行。我有几句话要交换。也许它看起来不太优雅,但可能有效。 - Marcin_cyna
2个回答

4

使用GNU sed:

sed '/^hello$/{ s/.*/bye/;b }; /^bye$/{ s/.*/hello/ }' file

b label:跳转到标签;如果省略标签,则跳转到脚本结尾。

输出:

bye
hello
hello
asd
bye

0
这可能适用于您(GNU sed):
sed -z 's/\<hello\>/\x00/ig;s/\<bye\>/hello/ig;s/\x00/bye/g' file

使用-z选项将文件读入内存。

将每个hello替换为零字节。

将每个bye替换为hello

将每个零字节替换为bye

注意:使用-z选项,模式空间中接受的字符串由零字节分隔。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接