仅当字符串 2、3 或 4 存在时才替换字符串 1

仅当字符串 2、3 或 4 存在时才替换字符串 1

基本上我是一个oracle dba。我们有一个从主数据库切换到备用数据库的任务,我们需要在包含 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

假设当第一列中有文本时开始一个条目,您可以使用以下命令更改这三个条目

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)

就是这样。:)

相关内容