[英]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.