使用sed替换括号内的内容,即使有多个嵌套内容
我正在使用使用sed替换括号内的内容,即使有多个嵌套内容,sed,brackets,Sed,Brackets,我正在使用sed查找和删除带有开始括号和结束括号的文本表达式 示例:sed-re的/SCYEXIT\([^]+\)/g' 适用于空括号:SCYEXIT(“”) 但是我的一些文本行有两对方括号,上面的搜索失败 失败示例:SCYEXIT('/var/mqm/exits/SecExitSender(SecurityExit) 结果是:”) 有些括号是空的(“”) 或者具有内容('FN=/var/mqm/exits/sendexit.data') 甚至还有另外一对括号 比如('/var/mqm/exit
sed
查找和删除带有开始括号和结束括号的文本表达式
示例:sed-re的/SCYEXIT\([^]+\)/g'
适用于空括号:SCYEXIT(“”)
但是我的一些文本行有两对方括号,上面的搜索失败
失败示例:SCYEXIT('/var/mqm/exits/SecExitSender(SecurityExit)
结果是:”)
有些括号是空的(“”)
或者具有内容('FN=/var/mqm/exits/sendexit.data')
甚至还有另外一对括号
比如('/var/mqm/exits/SecExitSender(SecurityExit)')
如何处理所有匹配的括号
把事情弄清楚
我正在将IBM MQ从一个平台迁移到另一个平台,每个平台的参数都有一些差异。配置示例如下所示:
定义QLOCAL(“明信片”)SCYEXIT('/var/mqm/exits/SecExitSender(SecurityExit)')进程('')放置(启用)定义(0)替换
sed ':a
s/([^()][^()]*)//g
t a'
在这里,我想去掉SCYEXIT
和PROCESS
属性,这些属性与下面一对括号的内容无关。作为人类,你们马上明白我在这里用括号的意思。括号可以为空,也可以有值,甚至可以有嵌套值
我想要达到的结果是:
定义QLOCAL(“明信片”)放置(启用)定义(0)替换
sed ':a
s/([^()][^()]*)//g
t a'
使用[^()]而不是[^]),并重复进行替换,直到没有匹配的大括号对为止
使用[^()]而不是[^]),并重复进行替换,直到没有匹配的大括号。$cat ip.txt
SCYEXIT(“”)
定义QLOCAL(“明信片”)SCYEXIT('/var/mqm/exits/SecExitSender(SecurityExit)')进程('')放置(启用)定义(0)替换
过程(“”)asd
1 SCYEXIT(“”)
过程(“”)
定义QLOCAL(“明信片”)
使用sed的解决方案
$sed-E的/(SCYEXIT进程)\(\s+\)//g;s/(SCYEXIT |进程)\(.\s*\)/g'ip.txt
定义QLOCAL(“明信片”)放置(启用)定义(0)替换
自闭症
1.
定义QLOCAL(“明信片”)
表示(SCYEXIT |进程)\(\S+\)
或SCYEXIT
,后跟进程
,然后是一个或多个非空白字符,以(
结尾)
表示(SCYEXIT | PROCESS)\(.\s*\)
或SCYEXIT
,后跟PROCESS
,然后是任意字符、任意数量的空格、另一个字符,最后是(
-->这将处理空括号的情况)
- 对于非GNU版本,使用
和[[:space:][]
而不是[^[:space:][]
和\s
\s
perl
可用
perl-pe的/(SCYEXIT |进程)\(.*?\)(|$)//g'ip.txt
除了在SCYEXIT
或过程
的括号结束后删除空格(如果存在)之外,其输出与sed
解决方案相同
SCYEXIT(“”)
定义QLOCAL(“明信片”)SCYEXIT('/var/mqm/exits/SecExitSender(SecurityExit)')进程('')放置(启用)定义(0)替换
过程(“”)asd
1 SCYEXIT(“”)
过程(“”)
定义QLOCAL(“明信片”)
使用sed的解决方案
$sed-E的/(SCYEXIT进程)\(\s+\)//g;s/(SCYEXIT |进程)\(.\s*\)/g'ip.txt
定义QLOCAL(“明信片”)放置(启用)定义(0)替换
自闭症
1.
定义QLOCAL(“明信片”)
表示(SCYEXIT |进程)\(\S+\)
或SCYEXIT
,后跟进程
,然后是一个或多个非空白字符,以(
结尾)
表示(SCYEXIT | PROCESS)\(.\s*\)
或SCYEXIT
,后跟PROCESS
,然后是任意字符、任意数量的空格、另一个字符,最后是(
-->这将处理空括号的情况)
- 对于非GNU版本,使用
和[[:space:][]
而不是[^[:space:][]
和\s
\s
perl
可用
perl-pe的/(SCYEXIT |进程)\(.*?\)(|$)//g'ip.txt
它的输出与
sed
解决方案相同,只是在SCYEXIT
或进程
的括号结束后删除空格,如果存在您需要提供有关数据的更多详细信息,如关闭后是否有文本)
,该数据是否包含)
?是@“sp asic”,文本位于右括号后。一个示例片段:定义通道('1234567890')CHLTYPE(RCVR)TRPTYPE(TCP)BATCHSZ(50)DESCR('')HBINT(300)MAXMSGL(4194304)MCAUSER('')MRDATA('')MREXIT('')MRRTY(10)MRTMR(1000)MSGDATA('')MSGEXIT('')NPMSPEED(FAST)PUTAUT(DEF)RCVDATA(“”)RCVEXIT(“”)SCYDATA(“”)SCYEXIT(‘/var/mqm/exits/SecExitSender(SecurityExit)’)替换该文本是否包含)
?如果没有,请尝试sed的/SCYEXIT(.*)//g'
这是我的第一个想法,但后来我意识到它会吃掉最后一个括号中的所有文本。所以这不是解决办法。我只需要到第一个结束括号。但是,如果有另一个开始括号,那么我必须使用第二个结束括号。您可以使用空格或行尾以及非贪婪匹配perl-pe的/SCYEXIT\(.*?)(|$)/g'
,您需要提供有关数据的更多详细信息,例如结束后是否有文本)
,以及该数据是否包含)
?是的@“sp asic”,是结束括号后的文本。示例代码段:定义通道('1234567890')CHLTYPE(RCVR)TRPTYPE(TCP)BATCHSZ(50)DESCR('')HBINT(300)MAXMS