sed / awkを使用してn番目の列を列で区切られた文字列に置き換える方法

sed / awkを使用してn番目の列を列で区切られた文字列に置き換える方法

次のような文字列があるとしましょう。

xyz="123" ; acd="234" ; plk="1234" ; apl="3456" ; www="2342"

plk="123"今、andを無視してsedを使って交換したいと思います。plk="789";""

出力:

xyz="123" ; acd="234" ; plk="789" ; apl="3456" ; www="2342

この問題を解決するのに役立ち、他のコマンドを使用できるかどうか教えてください。

ベストアンサー1

plk="1234"に置き換えるには、plk="789"次のことができます。

$ sed 's/plk="1234"/plk="789"/g' file
xyz="123" ; acd="234" ; plk="789" ; apl="3456" ; www="2342"

notplk="1234"ただし、この項目もに置き換えられます。これを防ぐために、単語の境界のみを一致させるためにplk="789"使用できます。\<

$ sed 's/\<plk="1234"/plk="789"/g' file
xyz="123" ; acd="234" ; plk="789" ; apl="3456" ; www="2342"

\<100%移植可能かどうかは不明なので、もしそうなら、次のようにすることもできます。

$ sed -E 's/(^| )plk="1234"/plk="789"/g' file
xyz="123" ; acd="234" ;plk="789" ; apl="3456" ; www="2342"

または代わりにPerlを使用してください:

$ perl -pe 's/\bplk="1234"/plk="789"/g' file
xyz="123" ; acd="234" ; plk="789" ; apl="3456" ; www="2342"

上記のすべてのコマンド(およびsed)を使用すると、フラグを追加して元のファイルを適切に編集perlできます。-i


上記のコマンドは置き換えられますみんなplk="1234"ファイルの各行で発生した回数。質問には記載していませんが、タイトルに「列 n」を記載しました。列をどのように定義したのか、どういう意味なのかわかりませんが、;3番目に区切られた列でのみこの置換を実行したい場合は、次のことを試すことができます(GNUを使用awk)。

$ awk -F';'  'BEGIN{OFS=";"}{$3=gensub(/plk="1234"/,"plk=\"789\"",1,$3); }1' file
xyz="123" ; acd="234" ; plk="789" ; apl="3456" ; www="2342"

おすすめ記事