私は次の行を持っています(実際にはこれらの行は約1Mあります):
foo|||bar
qux||boo|fzx
すべての行には正確に4つのフィールドが含まれていますが、文字数は3を超える場合があることに注意してください。
私がやりたいのは、すべて||
を|nil|
結果に置き換えることです。
foo|nil|nil|bar
qux|nil|boo|fzx
sedでそれを行う方法は何ですか?
私はこれを試しましたが失敗しました:
sed 's/||/|nil/g'
変更されなくなるまで置換を繰り返す必要があります。
sed ':a; s/||/|nil|/g; ta'
ただし、これは最初または最後の空のフィールドを処理しません。そのため、さらに2つのパターンが必要です。
sed 's/^|/nil|/; s/|$/|nil/; :a; s/||/|nil|/g; ta'
テスト
入力:
cat << EOF > infile
foo|||bar
qux||boo|fzx
|||
EOF
それを実行します:
<infile sed 's/^|/nil|/; s/|$/|nil/; :a; s/||/|nil|/g; ta'
出力:
foo|nil|nil|bar
qux|nil|boo|fzx
nil|nil|nil|nil
awk '{ for(i=1;i<=NF;i++) if(length($i)==0) $i="nil" } 1' FS='|' OFS='|'