5

私は次の行を持っています(実際にはこれらの行は約1Mあります):

foo|||bar
qux||boo|fzx

すべての行には正確に4つのフィールドが含まれていますが、文字数は3を超える場合があることに注意してください。

私がやりたいのは、すべて|||nil|結果に置き換えることです。

foo|nil|nil|bar
qux|nil|boo|fzx

sedでそれを行う方法は何ですか?

私はこれを試しましたが失敗しました:

sed 's/||/|nil/g'
4

1 に答える 1

17

変更されなくなるまで置換を繰り返す必要があります。

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='|'
于 2013-02-06T08:40:44.490 に答える