文字列2、3、または4が存在する場合にのみ、文字列1を置き換えます。

文字列2、3、または4が存在する場合にのみ、文字列1を置き換えます。

基本的に私はOracle DBAです。プライマリデータベースからスタンバイデータベースに切り替える作業があり、tns接続エントリを含むファイルでtnsエントリ(ホスト名)をtnsからtnsにsape-scan変更する必要があります。sapi-scantnsnames.oraSAP_PRODGOLD_PRODEVENTS_SAP

例:

SAP_PROD =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = sape-scan.walmart.net)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = SAP)
    )
  )

tnsエントリがSAP_PRODであることを確認したら、sape-scanをsapi-scanに変更する必要があります。

答え1

別のオプションはsedを使用することです。

sed -re '/^(SAP_PROD|GOLD_PROD|EVENTS_SAP) =/,/^$/s/HOST = sape-scan/HOST = sapi-scan/' tnsnames.ora
  • 正規表現置換の-rために拡張正規表現()を開く|
  • 次の引数(引用符付きテキスト)を評価する式として扱います(-e)。
  • 行の先頭に「SAP_PROD」、「GOLD_PROD」、または「EVENTS_SAP」で囲まれた行の間に空行が表示されるまで、スペースと等号が続きます。
  • 「HOST = sape-scan」テキストを検索して「HOST = sapi-scan」テキストに置き換えます。
  • tnsnames.ora ファイルから

上記のバージョンでは、以下を使用して変更を非破壊的にテストできます。

sed ... tnsnames.ora > tnsnames.new
diff tnsnames.ora tnsnames.new

…そして何が変わったのか見てください。多くの sed 実装では、-iフラグを追加することで「所定の位置」を変更できます。

答え2

最初の列にテキストがあるときに項目が始まると仮定すると、次を使用して3つの項目を変更できます。

awk '/^[A-Z]/ { substitute = ($1 ~ /^((SAP|GOLD)_PROD|EVENTS_SAP)$/) }
    substitute { sub(/sape-scan/, "sapi-scan") }1' tnsnames.ora >tnsnames.new

awk はスクリプトに従って入力行の各行を処理します。つまり、一重引用符の間のテキストは、ファイルの各行に適用される小さなプログラムです。

substituteこのスクリプトでは、ヘッダー行が正規表現と一致するかどうかを示すブール値に変数が設定されます。ブール値が true の場合、別のヘッダー行が表示されるまで各行で置換を実行し、ブール値を再評価して更新することができます。各行を個別に1印刷します。

diffソースファイルを変更できるように、出力は新しいファイルに保存されます。結果がうまくいけば、mv古いファイルを新しいファイル名に置き換えることができます。

答え3

とてもシンプルな兄弟、sed次のように使用してください

 sed -i -e 's/sape-scan/sapi-scan/g' $(grep -R 'SAP_PROD' ./ *ora|cut -d ':' -f1)

それはすべてです。 :)

関連情報