需要将 PIPE 符号之间的多个空格替换为无空格

pch*_*oor 2 sed awk

给定一个管道分隔的文件:

1|123|A |Normal Behaviour Exhibit 
2|345|B|Embedded|delimiter  
3|678|D|dimension 1"
4| |   | | nvalue
5| | | |Missing cvalue
Run Code Online (Sandbox Code Playgroud)

我需要使用 sed 或 awk 等 Unix 工具来替换所有出现| |||。符号之间可以有多个空格,|如上面第 4 行所示。

预期输出:

1|123|A |Normal Behaviour Exhibit 
2|345|B|Embedded|delimiter  
3|678|D|dimension 1"
4|||| nvalue
5||||Missing cvalue
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下sed命令,但没有达到预期的结果:

sed 's/| *|/||/g' S.txt > S1.txt

1|123|A |Normal Behavior Exhibit  
2|345|B|Embedded|delimiter  
3|678|D|dimension 1"
4||   || nvalue
5|| ||Missing cvalue
 
Run Code Online (Sandbox Code Playgroud)

Ed *_*ton 7

使用任何 sed:

$ sed 's/|  *|/||/g; s/|  *|/||/g' file
1|123|A |Normal Behaviour Exhibit
2|345|B|Embedded|delimiter
3|678|D|dimension 1"
4|||| nvalue
5||||Missing cvalue
Run Code Online (Sandbox Code Playgroud)

或使用任何 awk:

$ awk '{while( sub(/\| +\|/,"||") );} 1' file
1|123|A |Normal Behaviour Exhibit
2|345|B|Embedded|delimiter
3|678|D|dimension 1"
4|||| nvalue
5||||Missing cvalue
Run Code Online (Sandbox Code Playgroud)

  • 如果有人想知道为什么这有效,但 OP 的命令不起作用:“sed”将不匹配下一次搜索的替换部分。大多数人可能一直依赖这种行为,但没有意识到这一点。 (2认同)

Sté*_*las 6

使用perl,您可以将所有替换|<spaces>|,前提是它们后面跟着|使用(?=...)前瞻正则表达式运算符:

perl -pe 's/\| +(?=\|)/|/g' your-file
Run Code Online (Sandbox Code Playgroud)

perl还有一个用于n 处编辑-i的选项。i


Gil*_*not 5

使用awk

awk 'BEGIN{OFS=FS="|"}{for (i=1; i<=NF; i++) if ($i ~ /^ +$/) $i=""}1' file
1|123|A |Normal Behaviour Exhibit 
2|345|B|Embedded|delimiter  
3|678|D|dimension 1"
4|||| nvalue
5||||Missing cvalue
Run Code Online (Sandbox Code Playgroud)