Sql server Sed-替换文件最后第二行中出现的所有字符串
我有一个bash脚本,用于修改sql文件test.sql sql文件如下所示:Sql server Sed-替换文件最后第二行中出现的所有字符串,sql-server,regex,bash,sed,Sql Server,Regex,Bash,Sed,我有一个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 但是,这将返回以下new-test.sql文件: select count(
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
但是,这将返回以下new-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
WHERE子句中第二个出现的字符串START_DATE未被替换
我应该如何修改sed表达式以实现这一点?尝试如下操作:
sed -e '/where/ s/START_DATE/END_DATE/g' -i test.sql
说明:
只在包含where的行上操作,我们只处理与regex模式匹配的行where
将每次出现的开始日期替换为结束日期-请注意结尾处的全局标志g
i标志告诉sed就地编辑文件,无需重定向输出
如果您使用的是gnused,那么您可以使用以下命令
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
只需在s命令的末尾添加global g选项,您的解决方案也可以工作
sed 'x; ${/START_DATE/s/START/END/g;p;x}; 1d'
但是,如果文件有尾随的换行符,它将中断。我强烈建议不敏感地搜索WHERE子句的大小写,并运行相应的替换命令。您需要使用g标志替换所有出现的内容。。s/START/END/g。。。你也可以使用tac。。。tac test.sql | sed'2s/START/END/g | tac
sed 'x; ${/START_DATE/s/START/END/g;p;x}; 1d'