使用 Perl 从文本中删除特定正则表达式的所有实例

使用 Perl 从文本中删除特定正则表达式的所有实例

我正在寻找正确的 Perl 单行代码来从文本文件中删除特定正则表达式的所有实例。

也就是说,我想删除所有 [ 紧随其后的大写字母,然后是任意数量的字符和空格,直到 ] 的所有实例。例如,[CP 5.491][MS 283: 56 (variant) in Colapietro, 1989, p. XIV]

我想在 Perl 中完成此任务,因为我编写的用于处理文件的简单脚本已经采用该语言。

编辑:

在尝试了下面两个完全足够的答案之后,我意识到我在原来的问题中犯了一个错误(抱歉!):我还需要删除左括号后面跟着cf大写字母的实例,例如[cf. CP 2.282]。我该如何添加该参数?

答案1

去除:

  • 一个[人物 (\[
  • 紧跟一个大写字母([A-Z]仅限 Ascii)
  • 或(交替)字符串cf( ([A-Z]|cf))。
  • 然后后跟任意数量的字符和空格([^]]不是 a ]
  • 直到]\])为止。

您可以(在 Perl 中)使用以下任一方法:

\[([A-Z]|cf)[^]]\]        # Ascii uppercase, avoid `]`
[[]([A-Z]|cf)[^]][]]      # A bit more confusing expression of the same.
[[]([A-Z]|cf).*?[]]       # Use a lazy quantifier (the shorter match).
[[](\p{Lu}|cf).*?[]]      # Unicode property: Letter Uppercase.
\[(\p{Lu}|cf).*?\]        # Probably easier to read.

如果不使用否定范围表达式 ( [^]]) 或惰性匹配 ( .*?),则表达式将匹配整个字符串:

this part [CP 5.491] or this part [cf 283: 56 in Colapietro, 1989, p. XIV]

不是每个部分。

perl -pe '$_ =~ s/\[(\p{Lu}|cf).*?\]//g' file

答案2

假设只有大写字母的 ASCII 字符集,当您想要删除整个匹配行时,这可能就足够了:

perl -ne 'print unless m{\[([A-Z]|cf).*\]}' file

如果您只想删除“[CP 5.491]”等部分,保留周围的文本:

perl -pe 's{\[([A-Z]|cf).*?\]}{}g' file

相关内容