繁体   English   中英

Sed - 替换文件倒数第二行中出现的所有字符串

[英]Sed - Replace all occurrences of a string in the second last line of a file

我有一个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 但仅在sql文件的WHERE子句中。

到目前为止,我试过这个:

#!/bin/bash
sed 'x; ${/START_DATE/s/START/END;p;x}; 1d' test.sql > new-test.sql

但是,这将返回以下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 (我们的“地址”只匹配正则表达式模式的行where

  • 将每个START_DATE替换为END_DATE - 注意结尾处的“global”标记g

  • -i标志告诉sed“就地”编辑文件(不需要重定向输出)。

如果您使用的是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,那么不区分大小写的匹配会更复杂一些:

sed '/[wW][hH][eE][rR][eE]/ s/START_DATE/END_DATE/g' test.sql > new-test.sql

只需在s命令末尾添加全局g选项,也可以使您的解决方案正常工作。

sed 'x; ${/START_DATE/s/START/END/g;p;x}; 1d'

但是,如果文件具有尾随换行符,它将会中断。 我强烈建议搜索(不区分大小写) WHERE子句并运行相应的替换命令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM