【问题标题】:Perl - Replace pattern only in lines matching another patternPerl - 仅在与另一个模式匹配的行中替换模式
【发布时间】:2015-07-12 22:49:14
【问题描述】:

我正在使用 Perl 进行就地搜索和替换。我需要替换所有包含另一个单词的行中的所有单词。例如,仅删除包含PMPI_ 的行中的所有const。使用sed 我可以:

sed -i "/PMPI_/ s/const//g" file.c

但是,我需要多行功能,而 sed 似乎不是适合这项工作的工具。无论如何,我将 Perl 用于其他一切。我试过了

perl -pi -e "/PMPI_/ s/const//g" file.c

以及其他没有成功的变体。我只能在这个网站上找到 vim 正则表达式的等价物。

【问题讨论】:

  • sed 在多行上工作。
  • @AvinashRaj 是的,但从this answer 看来,Perl 似乎更适合这份工作。
  • @Alex:据我所知,perl -pi -e "s/const//g if /PMPI_/" file.cperl -pi -e "/PMPI_/ and s/const//g" file.c 将满足您的需求。我不明白您对多行工作的引用:PMPI_ 一次只能出现在 一个 行中!
  • @Borodin 是的,当然,这只是一个例子,我没有发布我正在使用的多行模式。
  • @Alex:所以对于 this 问题,您不需要多行,但是您正在寻找一个 确实 支持它的工具?我认为你应该澄清一下

标签: regex perl


【解决方案1】:

语法是:

perl -pi -e "s/const//g if /PMPI_/" file

注意:您说您需要多行功能。我认为您不是在寻找 slurp 模式(加载整个文件),但您也可以使用 -00 选项按段落工作:

echo 'PMPI_ const
const const' | perl -00 -p -e "s/const//g if /PMPI_/"

【讨论】:

  • 如此简单...我想我应该开始阅读一些 Perl 指南。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-04-02
  • 2013-06-17
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 2021-11-16
相关资源
最近更新 更多