在Perl中的一个正则表达式中存在两个字符串时替换字符串
发布时间:2020-12-15 21:44:40 所属栏目:大数据 来源:网络整理
导读:鉴于以下输入 $cat prestuff MACRO1 stuff MACRO2stuff MACRO2 stuff MACRO1stuff MACRO2 stuff 如果MACRO1也存在,我想替换MACRO2(与MACRO3).像这样: $perl -ne '/(?=.*MACRO1).*MACRO2/ ? print s/MACRO2/MACRO3/gr : print' prestuff MACRO1 stuff MACRO3
鉴于以下输入
$cat pre stuff MACRO1 stuff MACRO2 stuff MACRO2 stuff MACRO1 stuff MACRO2 stuff 如果MACRO1也存在,我想替换MACRO2(与MACRO3).像这样: $perl -ne '/(?=.*MACRO1).*MACRO2/ ? print s/MACRO2/MACRO3/gr : print' pre stuff MACRO1 stuff MACRO3 stuff MACRO3 stuff MACRO1 stuff MACRO2 stuff (我想这个表达式的.* MACRO2部分是不必要的,现在我考虑一下) $perl -ne '/MACRO1/ ? print s/MACRO2/MACRO3/gr : print' pre 我想弄清楚的是如何只使用正则表达式来做到这一点.这是一次尝试: $perl -ne 'print s/(?=.*MACRO1)(?=.*MACRO2)MACRO2/MACRO3/gr' pre stuff MACRO1 stuff MACRO2 stuff MACRO3 stuff MACRO1 stuff MACRO2 stuff 我认为我对前瞻运算符如何同时成为“锚”和“非消费”都有一些根本的困惑.如果我考虑?=作为一个锚点,我认为上述方法不起作用.但这似乎与“非消费”相矛盾. 任何人都可以定义非消费的含义,并向我展示一个可以产生预期结果的正则表达式吗? 解决方法
首先,让我们得到实际的解决方案:
perl -pe's/MACRO2/MACRO3/g if /MACRO1/' 现在,让我们看看你的特殊要求.作为单个替换,它看起来如下所示: perl -pe's/MACRO2(?:(?<=MACRO1.*)|(?=.*MACRO1))/MACRO3/g' 忽略这不起作用的事实,因为不支持可变宽度的lookbehinds,这是非常低效的.虽然我提出的第一个解决方案所需的时间受文件大小的限制,但此解决方案所需的时间受文件大小的因子乘以MACRO2实例数的因子! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |