给定一个管道分隔的文件:
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)
使用任何 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)
使用perl,您可以将所有替换|<spaces>为|,前提是它们后面跟着|使用(?=...)前瞻正则表达式运算符:
perl -pe 's/\| +(?=\|)/|/g' your-file
Run Code Online (Sandbox Code Playgroud)
perl还有一个用于n 处编辑-i的选项。i
使用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)