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

San*_*osh 3 unix sed

我在Unix中有一个要求,要用空格替换单词的出现。我的文件如下所示。我需要替换| NA | 与空间

文件格式

1234|NA|NA|abcd|xyz
2345|NA|NA|NA|lmn
456|NA|abcd|xya|ggh
Run Code Online (Sandbox Code Playgroud)

预期产量

1234| | |abcd|xyz
2345| | | |lmn
456| |abcd|xya|ggh
Run Code Online (Sandbox Code Playgroud)

我正在使用以下命令,但它仅替换第一次出现的命令

sed 's/|NA|| |/g'
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 6

尽管g修饰符确实进行了“全局”替换,但这些替换必须不重叠。当需要重叠的替换时,必须循环:

$ sed ':a; s/|NA|/| |/g; ta' file.txt
1234| | |abcd|xyz
2345| | | |lmn
456| |abcd|xya|ggh
Run Code Online (Sandbox Code Playgroud)

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

sed -e ':a' -e ' s/|NA|/| |/g; ta' file.txt
Run Code Online (Sandbox Code Playgroud)

怎么运行的

  • :a创建一个标签a

  • s/|NA|/| |/g执行所需的替换,但仅对的非重叠实例执行|NA|

  • ta告诉sed a如果前面的替换命令导致该行发生任何更改,则跳至label 。以此方式,替换命令会根据需要重复多次,以替换每次出现的|NA|

  • BSD`sed`不喜欢`:a`之后的分号。关于有效的最简单的修复方法是`sed -e':a'-e's / | NA | / | | / g; ta”,但是如果在“ ta”后面跟随更多命令,则需要在单独的“ -e”参数中隔离多余的内容。 (3认同)