sed を使用して、2 つの文字列のすべての項目を完全に置き換えます。

sed を使用して、2 つの文字列のすべての項目を完全に置き換えます。

StringAとStringBを複数回含むファイルがあるとしましょう。すべてのStringA項目をStringBに置き換え(同時に)、すべてのStringB項目をStringAに置き換えたいと思います。

今私は次のことをしています

cat file.txt | sed 's/StringB/StringC/g' | sed 's/StringA/StringB/g' | sed 's/StringC/StringA/g'

このアプローチの問題は、StringCがファイルにないと仮定することです。実際にはこれは問題ではありませんが、このソリューションはまだ厄介な感じです。つまり、UNIXの魔法をもっと学ぶ機会のように感じられます。 :)

ベストアンサー1

StringBと同じ入力行に表示できない場合は、StringAsedに一方向の置換を実行し、最初の検索文字列が発生しない場合にのみ別の方法を試すように指示できます。

<file.txt sed -e 's/StringA/StringB/g' -e t -e 's/StringB/StringA/g'

一般的に、sedには簡単な方法はないと思います。但し、指定は とStringA重複することができる場合あいまいです。StringBこれは文字列の左端の項目を置き換えてから繰り返すPerlソリューションです。

<file.txt perl -pe 'BEGIN {%r = ("StringA" => "StringB", "StringB" => "StringA")}
                    s/(StringA|StringB)/$r{$1}/ge'

POSIXツールを引き続き使用するには、awkが最善の選択です。 Awkには一般的なパラメータ置換のための基本的な要素がないので、自分で開発する必要があります。

<file.txt awk '{
    while (match($0, /StringA|StringB/)) {
        printf "%s", substr($0, 1, RSTART-1);
        $0 = substr($0, RSTART);
        printf "%s", /^StringA/ ? "StringB" : "StringA";
        $0 = substr($0, 1+RLENGTH)
    }
    print
}'

おすすめ記事