基本的に私はOracle DBAです。プライマリデータベースからスタンバイデータベースに切り替える作業があり、tns接続エントリを含むファイルでtnsエントリ(ホスト名)をtnsからtnsにsape-scan
変更する必要があります。sapi-scan
tnsnames.ora
SAP_PROD
GOLD_PROD
EVENTS_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)
それはすべてです。 :)