使用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