在unix中使用sed替换单词的多次出现

时间:2016-06-13 22:51:53

标签: unix sed

我在unix中要求用空格替换单词的出现。 我的文件看起来像下面。我需要更换| NA |带空格

文件格式

1234|NA|NA|abcd|xyz
2345|NA|NA|NA|lmn
456|NA|abcd|xya|ggh

预期产出

1234| | |abcd|xyz
2345| | | |lmn
456| |abcd|xya|ggh

我使用以下命令,但它只替换第一次出现

sed 's/|NA|| |/g'

3 个答案:

答案 0 :(得分:5)

虽然g修饰符确实会进行“全局”替换,但替换必须不重叠。当需要重叠替换时,必须循环:

$ sed ':a; s/|NA|/| |/g; ta' file.txt
1234| | |abcd|xyz
2345| | | |lmn
456| |abcd|xya|ggh

以上是在GNU sed上测试的。对于BSD(OSX)sed(帽子提示:Jonathan Leffler),标签a必须仅出现在命令字符串的末尾:

sed -e ':a' -e ' s/|NA|/| |/g; ta' file.txt

如何运作

  • :a创建标签a

  • s/|NA|/| |/g执行您想要的替换,但仅适用于|NA|的非重叠实例。

  • ta告诉sed如果前面的替换命令导致对该行的任何更改,则跳转到标签a。通过这种方式,替换命令会根据需要重复多次,以替换|NA|的每一次出现。

答案 1 :(得分:2)

只需使用awk即可获得清晰,简洁,可移植性,可扩展性等等:

$ awk '{while(gsub(/\|NA\|/,"| |"));}1' file
1234| | |abcd|xyz
2345| | | |lmn
456| |abcd|xya|ggh

第一次循环时,gsub()会替换正则表达式的所有奇数编号,第二次通过它替换剩下的任何内容。它可以在任何UNIX系统上与任何awk一样工作。

答案 2 :(得分:0)

完全试图逃离垂直栏失败。然后没有尝试 有垂直栏参与,它的工作!也错过了 更换只是一个空间,现在已更正。这种方式很容易 通过增加空间来扩展。

 awk '{gsub(/NA/," ")}1' file 
1234| | |abcd|xyz
2345| | | |lmn
456| |abcd|xya|ggh