如何用Sed复制并修改SQL文件中的同义词创建语句?
使用sed批量修改SQL语句的解决方案
当然可以用sed快速搞定这个需求!下面是具体的实现命令和详细解释:
核心sed命令
sed 's/EXECUTE IMMEDIATE '\''CREATE OR REPLACE PUBLIC SYNONYM '\'' || myTable || '\'' FOR SCHEMA1.'\'' || myTable;/EXECUTE IMMEDIATE '\''CREATE OR REPLACE SYNONYM SCHEMA2.'\'' || myTable || '\'' FOR SCHEMA1.'\'' || myTable;\ EXECUTE IMMEDIATE '\''CREATE OR REPLACE SYNONYM SCHEMA3.'\'' || myTable || '\'' FOR SCHEMA1.'\'' || myTable;/' myTable.sql
如果需要直接修改原文件并生成备份(推荐,防止误操作),可以加上-i参数:
sed -i.bak 's/EXECUTE IMMEDIATE '\''CREATE OR REPLACE PUBLIC SYNONYM '\'' || myTable || '\'' FOR SCHEMA1.'\'' || myTable;/EXECUTE IMMEDIATE '\''CREATE OR REPLACE SYNONYM SCHEMA2.'\'' || myTable || '\'' FOR SCHEMA1.'\'' || myTable;\ EXECUTE IMMEDIATE '\''CREATE OR REPLACE SYNONYM SCHEMA3.'\'' || myTable || '\'' FOR SCHEMA1.'\'' || myTable;/' myTable.sql
执行后会生成myTable.sql.bak备份文件,原文件myTable.sql会被自动更新。
命令细节解释
- 替换逻辑:
s/原内容/新内容/是sed的核心替换指令,这里我们精准匹配原SQL语句的完整文本。 - 单引号转义:bash环境中单引号字符串内的单引号需要用
'\''转义(逻辑是:关闭当前单引号 → 输出一个单引号 → 重新打开单引号),所以你会看到命令里有不少这类转义组合。 - 生成两行语句:在替换内容里,用行尾的
\表示换行,这样sed会把原单行语句替换成两行目标语句——同时去掉了原语句的PUBLIC关键字,分别加上SCHEMA2.和SCHEMA3.的前缀。
效果验证
假设原文件myTable.sql中有这一行:
EXECUTE IMMEDIATE 'CREATE OR REPLACE PUBLIC SYNONYM ' || myTable || ' FOR SCHEMA1.' || myTable;
执行sed命令后,该行会被替换为:
EXECUTE IMMEDIATE 'CREATE OR REPLACE SYNONYM SCHEMA2.' || myTable || ' FOR SCHEMA1.' || myTable; EXECUTE IMMEDIATE 'CREATE OR REPLACE SYNONYM SCHEMA3.' || myTable || ' FOR SCHEMA1.' || myTable;
内容的提问来源于stack exchange,提问作者Mildju




