updateSql.txt内容
update aaaa set id='XX' where id = ''
update B.aaaa set id='XX' where id = ''
needBakReg='^\s*update\s+\S+\.(\S{2,}).*|^\s*update\s+(\S{2,}).*'
while read upSql
do
echo ${upSql} |sed -r 's#${needBakReg}#\1#g'
done < updateSql.txt
本意是想取updateSql.txt中第一行的aaaa,第二行的aaaa。
但目前只能取第二行的aaaa。也即是needBakReg里|左边的。右边的没生效。
后调试,发现这种写法只能匹配到第一个正则。不知道是我写法有误还是其他限制条件。望各位大佬指点
liunx sed 扩展正则中对|的支持
-
- 帖子: 8
- 注册时间: 2024-01-10 18:19
- 系统: liunx
- astolia
- 论坛版主
- 帖子: 6513
- 注册时间: 2008-09-18 13:11
Re: liunx sed 扩展正则中对|的支持
跟|没关系。原因是你在sed后面写的是\1。\1匹配的是整个正则表达式中的第一个分组,也就是|前面的那对括号,即使文本匹配的是|后面的内容
你可以改成\1\2
你可以改成\1\2
-
- 帖子: 8
- 注册时间: 2024-01-10 18:19
- 系统: liunx
-
- 帖子: 8
- 注册时间: 2024-01-10 18:19
- 系统: liunx
Re: liunx sed 扩展正则中对|的支持
因为工作中最近在做工具,所以遇到不少问题之前没遇到过。现在还有个问题就是对符合某个区间的的文件,我要把多行合并。又遇到一个问题,合并不了。比如
处理的文件中包含如下内容
CREATE TABLE A AS
SELECT * FROM USER_TABLES;
我想把符合上面的两行合并为一行(只是符合该格式的才合并),即变成
CREATE TABLE A AS SELECT * FROM USER_TABLES;
我的处理脚本试过
sed -i -r "/CREATE\s+TABLE\s+\S+\s+AS/,/;/s/\n/ /g" sql.txt
sed -i -r "/CREATE\s+TABLE\s+\S+\s+AS/,/;/s/\r\n/ /g" sql.txt
都不行(一个换行符一个空格)
但如果我弄成
sed -i -r "/CREATE\s+TABLE\s+\S+\s+AS/,/;/s/ /@/g" sql.txt
可以把CREATE TABLE A AS一直到第二行;中的空格换成@
如果我需要把该段的换行符换成空格正确的写法应该是啥呢
处理的文件中包含如下内容
CREATE TABLE A AS
SELECT * FROM USER_TABLES;
我想把符合上面的两行合并为一行(只是符合该格式的才合并),即变成
CREATE TABLE A AS SELECT * FROM USER_TABLES;
我的处理脚本试过
sed -i -r "/CREATE\s+TABLE\s+\S+\s+AS/,/;/s/\n/ /g" sql.txt
sed -i -r "/CREATE\s+TABLE\s+\S+\s+AS/,/;/s/\r\n/ /g" sql.txt
都不行(一个换行符一个空格)
但如果我弄成
sed -i -r "/CREATE\s+TABLE\s+\S+\s+AS/,/;/s/ /@/g" sql.txt
可以把CREATE TABLE A AS一直到第二行;中的空格换成@
如果我需要把该段的换行符换成空格正确的写法应该是啥呢
- astolia
- 论坛版主
- 帖子: 6513
- 注册时间: 2008-09-18 13:11
Re: liunx sed 扩展正则中对|的支持
sed并不是一个适合处理多行文本的工具,用其他文本处理工具比如awk,或者其他脚本语言,甚至用vim的末行模式都更合适些
非要用sed的话,就要和它内建的一些命令打交道,个人是非常不推荐的
非要用sed的话,就要和它内建的一些命令打交道,个人是非常不推荐的
代码: 全选
sed -i -r '/CREATE\s+TABLE\s+\S+\s+AS$/N;s/\n/ /;' sql.txt
-
- 帖子: 8
- 注册时间: 2024-01-10 18:19
- 系统: liunx