sedを介して複数の値を置き換える正規表現パターン

sedを介して複数の値を置き換える正規表現パターン

ローカルホストのIPアドレスを解析し、2番目のオクテットを別の値に置き換える必要があるスクリプトがあり、置き換えられた値は現在の値によって異なります。

たとえば、IPが次のような場合10.10.100.6そして、私が必要とする結果は次のとおりです。10.20.100.6、IPが以下の場合10.20.100.6そして、私が必要とする結果は次のとおりです。10.10.100.6

私は以下を試しました:

nmcli con show eno16777984 | grep -E '^ipv4.address' | awk -F"/|[[:space:]]+" '{print $2}' | sed -e 's/^10\.10\./10.20./; s/^10\.20\./10\.10\./'

私が経験している問題は、sedコマンドで設定された順序で置換が発生することです。だから結果は常に10.10....

現在の値がパターンと一致する場合にのみsedに値を変更させる方法はありますか?

ありがとうございます!

ポリスチレンこのコード行は複数の場所で置き換えられて実行され、これを実行する人は限られた経験/知識を持っているため、文書からコピーして貼り付ける必要があるため、短い1行のコードでなければなりません。

修正する

私はついに次のようにこれを行う方法を見つけましたawk

nmcli con show eno16777984 | grep -E '^ipv4.address' | awk -F"/|[[:space:]]+" '{print $2}' | awk -F. '{print $1"."($2 == "10" ? "20" : "10")"."$3"."$4}'

しかし、以下にこれを行う方法を示す素晴らしく簡単な答えがありますsed

答え1

ただ追加してくださいt;

sed -e 's/^10\.10\./10.20./;t;s/^10\.20\./10\.10\./'

成功すると最後まで分岐します。しかし、実際には、これらのすべてのgrep、awk、sedを1つのawkにまとめる必要があります。

答え2

2 つの文字列を置き換えるには、再度変更されない一時的な 3 番目の文字列を使用します。

sed -e 's/^10\.10\./10.foo./g; s/^10\.20\./10.10./g; s/^10\.foo\./10.20./g'

答え3

grepパイプを接続したり、ここにsed入力しawkたりawk入力したりする必要はありませんawkawk一度にすべての操作を実行できます。

nmcli con show eno16777984 | 
  awk -F"/|[[:space:]]+" '
    /^ipv4.address/ {
      if ($2 ~ /^10\.10/) {
        sub(/10\.10/,"10.20",$2);
      } else if ($2 ~ /^10\.20/) {
        sub(/10\.20/,"10.10",$2);
      };
    };

    1' 

で始まる行で、ipv4.address2番目のフィールドがで始まるとに10.10変わり10.20、で始まる10.20と置き換えられます10.10。変更するかどうかにかかわらず、すべての行を印刷します。 (これは1awkショートカットです。1は常にtrueと評価され、デフォルトのアクションはprintです。この行は機能しますif true then print the current line。)

関連情報