パイプで区切られたファイルがある場合:
1|123|A |Normal Behaviour Exhibit
2|345|B|Embedded|delimiter
3|678|D|dimension 1"
4| | | | nvalue
5| | | |Missing cvalue
| |
すべての項目を置き換えるには、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
次のコマンドを試しましたが、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
答え1
すべての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
または 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
答え2
を使用すると、予測正規表現演算子を使用して次の場合にすべてをにperl
置き換えることができます。|<spaces>
|
|
(?=...)
perl -pe 's/\| +(?=\|)/|/g' your-file
perl
n箇所で編集-i
できるオプションもあります。i
答え3
使用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
答え4
最初の一致は、最後が2番目の一致の一部である必要があるパイプを消費します。
修飾子を使用する代わりに、一致する項目がなくなるまで代替項目を繰り返しますg
。
sed -e ': loop' -e 's/| *|/||/' -e 't loop'
パターンに2つのスペースを使用したため、||
一致するものはありません。