次のsedコマンドは期待どおりに機能しています。私がする必要があるのは、2番目の列でのみnull(\ n)を0に変更することです。
# cat nulltest.txt
1 abc
1 \N
\N xyz
# sed 's/\\N/0/' nulltest.txt
1 abc
1 0
0 xyz
推測される結果 :
1 abc
1 0
\N xyz
データはタブ「\t」で区切られます
kent$ echo "1 abc
1 \N
\N xyz"|awk '{gsub(/\\N/,"0",$2)}1'|column -t
1 abc
1 0
\N xyz
sed式で以下の正規表現を使用して\N、2番目の列にあることを確認できます。
^([^\t]+\t)\\N(\t)
したがって、sed式は次のようになります。
sed -r -i 's/^([^\t]+\t)\\N(\t)/\10\2/g' nulltest.txt
説明:
^([^\t]+\t):一致し、その後に正規表現が1続き、最初のグループになります。\t()
\\N:一致します\N
(\t):tab2番目のグループである後の2番目の列です。
sed通知の置換セクションでは、\1とを使用します。これは、正規表現\2の最初のグループと2番目のグループを表します。したがって、グループ1と2を保持し、一致した文字列の残りを。に置き換えます。1 followed by \t\t0
私のテストでは、以下の入力ファイルを使用しました
abcdefgh
3 abc \N \N \N
123 \N \N \N
\N \Nxyz
そして私が得る出力は
abcdefgh
3 abc \N \N \N
123adsa 0 \N \N
\N \Nxyz
\Nfrom2nd列が置き換えられていることに注意してください。\Nこのsed式の列がいくつあっても、列\Nからのみ置き換えられ2ndます。
これを試して:
sed -r 's/^([^\t]+\t)\\N/\10/' nulltest.txt