加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在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实例数的因子!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读