sedまたはawkを使用して列間のテキストを置き換える

sedまたはawkを使用して列間のテキストを置き換える

次の形式のテキストを置き換える方法を見つけようとしています。

input1:input2:input3
aaa:bbb:ccc
111:222:333

私は結果が次のようになりたいと思います:

input1:new-text:input3
aaa:new-text:ccc
111:new-text:333

結果が良い場合は、sed、awk、cut、または他の何かを実行できます。

答え1

awkは、「コロンで区切られた2番目のフィールドを」に置き換える規則を考慮して、new-textこれを非常に簡単にします。

awk -F':' 'BEGIN { OFS=FS } {$2="new-text"; print} ' < input > output

-F':'コロンを使用して各行のフィールドを区切るようにawkに指示します。

このBEGINセクションは出力後で行を再印刷するときに awk がコロンを再利用してフィールドを結合できるように、フィールド区切り文字を現在のフィールド区切り記号 (コロン) に変更します。

2番目の部分の前には条件がないので、各行が実際に実行されるのは、2番目のフィールドを次に置き換えてから、新しい行をnew-text印刷することです。

答え2

ファイルの各行にある唯一の「:」ペア間の中間ブロックを置き換えるためにまったく同じテキストが必要な場合は、この方法が機能します。

sed -i -- "s|:.*:|:${mynewtext}:|"   $inputfile

Pattern.*は1つ以上の文字のみを表します。

答え3

テキストが次のファイルにあるとしましょう。code

]$cat code
input1:input2:input3
aaa:bbb:ccc
111:222:333

このコマンドを実行してください

]$sed -e 's/:[^:]*:/:new-text:/' code
input1:new-text:input3
aaa:new-text:ccc
111:new-text:333

答え4

削除する列を提供し、コードの実行中に置き換える列のsed新しい内容を提供できる一般的なPOSIX sed方式でこれを表示するには、次のようにします。

n=2;             # the column number to be modified with a new value

repl="new-text"; # the text used to replace the contents of the n-th col

# to make the replacement sed friendly, otw, if it happened to have chars
# which have a meaning to sed when using on the rhs of s/// command, we will
# have an error on our hands.
repl_esc=$(printf '%s\n' "$repl" | sed -e 's|[\&/]|\\&|g;$!s/$/\\/')

sed -e '
    s/.*/:&:/
    '"s/:/\\n/$n;s//\\
/$n;
    s/\\n.*\\n/:${repl_esc}:/"'
    s/^://
    s/:$//
' input-file.txt

関連情報