liunx sed 扩展正则中对|的支持

sh/bash/dash/ksh/zsh等Shell脚本
回复
359976140@qq.com
帖子: 8
注册时间: 2024-01-10 18:19
系统: liunx

liunx sed 扩展正则中对|的支持

#1

帖子 359976140@qq.com » 2024-01-15 16:51

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里|左边的。右边的没生效。
后调试,发现这种写法只能匹配到第一个正则。不知道是我写法有误还是其他限制条件。望各位大佬指点
头像
astolia
论坛版主
帖子: 6452
注册时间: 2008-09-18 13:11

Re: liunx sed 扩展正则中对|的支持

#2

帖子 astolia » 2024-01-16 9:19

跟|没关系。原因是你在sed后面写的是\1。\1匹配的是整个正则表达式中的第一个分组,也就是|前面的那对括号,即使文本匹配的是|后面的内容
你可以改成\1\2
359976140@qq.com
帖子: 8
注册时间: 2024-01-10 18:19
系统: liunx

Re: liunx sed 扩展正则中对|的支持

#3

帖子 359976140@qq.com » 2024-01-16 11:57

astolia 写了: 2024-01-16 9:19 跟|没关系。原因是你在sed后面写的是\1。\1匹配的是整个正则表达式中的第一个分组,也就是|前面的那对括号,即使文本匹配的是|后面的内容
你可以改成\1\2
谢了谢了,试了下确实可以,整个正则出现多少个分组后边如果要应用就要写几个。
359976140@qq.com
帖子: 8
注册时间: 2024-01-10 18:19
系统: liunx

Re: liunx sed 扩展正则中对|的支持

#4

帖子 359976140@qq.com » 2024-01-16 16:27

因为工作中最近在做工具,所以遇到不少问题之前没遇到过。现在还有个问题就是对符合某个区间的的文件,我要把多行合并。又遇到一个问题,合并不了。比如
处理的文件中包含如下内容
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
论坛版主
帖子: 6452
注册时间: 2008-09-18 13:11

Re: liunx sed 扩展正则中对|的支持

#5

帖子 astolia » 2024-01-17 17:27

sed并不是一个适合处理多行文本的工具,用其他文本处理工具比如awk,或者其他脚本语言,甚至用vim的末行模式都更合适些

非要用sed的话,就要和它内建的一些命令打交道,个人是非常不推荐的

代码: 全选

sed -i -r '/CREATE\s+TABLE\s+\S+\s+AS$/N;s/\n/ /;' sql.txt
359976140@qq.com
帖子: 8
注册时间: 2024-01-10 18:19
系统: liunx

Re: liunx sed 扩展正则中对|的支持

#6

帖子 359976140@qq.com » 2024-01-18 11:41

astolia 写了: 2024-01-17 17:27 sed并不是一个适合处理多行文本的工具,用其他文本处理工具比如awk,或者其他脚本语言,甚至用vim的末行模式都更合适些

非要用sed的话,就要和它内建的一些命令打交道,个人是非常不推荐的

代码: 全选

sed -i -r '/CREATE\s+TABLE\s+\S+\s+AS$/N;s/\n/ /;' sql.txt
试了下可行。版主太厉害了很感谢,习惯了sed直接在原文件中处理文件
回复