基本上我是一个oracle dba。我们有一个从主数据库切换到备用数据库的任务,我们需要在包含 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
假设当第一列中有文本时开始一个条目,您可以使用以下命令更改这三个条目
awk '/^[A-Z]/ { substitute = ($1 ~ /^((SAP|GOLD)_PROD|EVENTS_SAP)$/) }
substitute { sub(/sape-scan/, "sapi-scan") }1' tnsnames.ora >tnsnames.new
awk 根据脚本处理输入行中的每一行,即单引号之间的文本是一个小程序,它应用于文件中的每一行。
在此脚本中,变量substitute
设置为布尔值,指示标题行是否与正则表达式匹配。如果布尔值为真,我们对每一行执行替换,直到看到另一个标题行,并且布尔值再次被评估并可能被更新。单独的1
导致每一行被打印。
输出被放置在一个新文件中,以便您可以diff
对照原始文件进行修改。如果您对结果满意,只需将mv
新文件替换为旧文件的名称即可替换旧文件。
答案3
很简单的兄弟,使用sed
如下
sed -i -e 's/sape-scan/sapi-scan/g' $(grep -R 'SAP_PROD' ./ *ora|cut -d ':' -f1)
就是这样。:)