我正在寻找正确的 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