Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Sed-替换文件最后第二行中出现的所有字符串_Sql Server_Regex_Bash_Sed - Fatal编程技术网

Sql server Sed-替换文件最后第二行中出现的所有字符串

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(

我有一个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(*) 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'