ファイルからパターンを検索し、インライン列の部分文字列を置き換える

ファイルからパターンを検索し、インライン列の部分文字列を置き換える

以下は、変更するファイルの一部です。 awk または sed を使用できます。すべてのユーティリティはパターンマッチングに適しています。

rhts-mgr hostname                       g05-rhts01
rhts-mgr ntp-server-ip-addr             10.113.XX.31
rhts-mgr ntp-redundant-server-ip-addr   10.113.XX.32
rhts-mgr extern-iface ip-addr           10.113.XX.129
rhts-mgr extern-iface broadcast-addr    10.113.XX.255
rhts-mgr extern-iface default-gw        10.113.XX.1

私はawk、sedの組み合わせのバリエーションを試しましたが、まだこれに慣れていません。上記のファイル項目を下のファイル項目に変更しようとしています。

rhts-mgr hostname                       g08-rhts01
rhts-mgr ntp-server-ip-addr             10.113.55.31
rhts-mgr ntp-redundant-server-ip-addr   10.113.55.32
rhts-mgr extern-iface ip-addr           10.113.55.129
rhts-mgr extern-iface broadcast-addr    10.113.55.255
rhts-mgr extern-iface default-gw        10.113.55.1

ロジックは次のとおりです。

  1. rhts-mgr ホスト名を検索し、$3 のすべてのホスト名エントリを g*-rhts* から g08-rhts* に置き換えます。
  2. IPアドレスの3番目のオクテットのサブネットのみを置き換えます(例:10.113.XX.31から10.113.55.31へ)。

次のようなものが役に立ちます

awk '/^rhts-mgr hostname/ {<replace $3 with g08-rhts[0-9][0-9]>}; print}' file
awk '/^rhts-mgr extern-iface ip-addr/ {<replace $4 10.113.XX.129 with 10.113.55.129>}; print}' file

編集する必要があるファイルは100個を超えていますが、この編集は各ファイルに対して実行する必要があります。したがって、1つのファイルからすべての置換項目を検索し、検索中にそれらを置き換えてテキスト処理を高速化できることをお勧めします。

答え1

sed:

sed -E '
  s/^(rhts-mgr hostname +g)[0-9]+(\-rhts.*)$/\108\2/;
  s/^(rhts-mgr.* 10\.113\.)[0-9]+(\..*)$/\155\2/;
  s/^(rhts-cntrl.* 10\.113\.)[0-9]+(\..*)$/\153\2/
' file

真珠:

perl -ne '
  s/^(rhts-mgr hostname\s+g)\d+(\-rhts.*)$/${1}08${2}/;
  s/^(rhts-mgr.* 10\.113\.)\d+(\..*)$/${1}55${2}/;
  s/^(rhts-cntrl.* 10\.113\.)\d+(\..*)$/${1}53${2}/;
  print
' file

関連情報