我有一个bash脚本,用于修改sql文件(test.sql)。
sql文件如下所示:
select count(*) from (
select
I.ID,
I.START_DATE,
I.END_DATE
from MY_TABLE I with (nolock)
where I.START_DATE >= '20170101' and I.START_DATE < '20170201'
) as cnt我想替换所有字符串START_DATE 的出现,但只替换WHERE子句中的。
到目前为止,我已经尝试过:
#!/bin/bash
sed 'x; ${/START_DATE/s/START/END;p;x}; 1d' test.sql > new-test.sql但是,这将返回以下新的test.sql文件:
select count(*) from (
select
I.ID,
I.START_DATE,
I.END_DATE
from MY_TABLE I with (nolock)
where I.END_DATE >= '20170101' and I.START_DATE < '20170201'
) as cnt字符串START_DATE在WHERE子句中的第二次出现没有被替换。
我应该如何修改sed表达式以实现这一点?
发布于 2017-06-17 00:06:52
试着这样做:
sed -e '/where/ s/START_DATE/END_DATE/g' -i test.sql解释:
where的行上操作(我们只“地址”与regex模式where匹配的行)START_DATE替换为END_DATE --请注意末尾的“全局”标志g-i标志告诉sed编辑文件“就位”(不需要重定向输出)。发布于 2017-06-17 07:06:36
如果使用的是GNU sed,则可以使用以下命令
sed '/WHERE/I s/START_DATE/END_DATE/g' test.sql > new-test.sql
^
|-------------------------- case insensitive match; GNU sed only大写字母I告诉sed执行不区分大小写的匹配。这在处理不区分大小写的SQL命令时非常方便。
如果您没有GNU,那么不区分大小写的匹配就会更加复杂:
sed '/[wW][hH][eE][rR][eE]/ s/START_DATE/END_DATE/g' test.sql > new-test.sql简单地在g命令的末尾添加全局s选项也会使解决方案工作。
sed 'x; ${/START_DATE/s/START/END/g;p;x}; 1d'但是,如果文件有尾随的换行符,它就会中断。我强烈建议搜索WHERE子句(大小写不敏感)并运行以下替换命令。
https://stackoverflow.com/questions/44599449
复制相似问题