我在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'
答案 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