PIPEシンボル間の複数のスペースはスペースなしで置き換える必要があります。

PIPEシンボル間の複数のスペースはスペースなしで置き換える必要があります。

パイプで区切られたファイルがある場合:

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

perln箇所で編集-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つのスペースを使用したため、||一致するものはありません。

関連情報