Text-Processing

使用 Perl 從文本中刪除特定正則表達式的所有實例

  • April 26, 2020

我正在尋找正確的 Perl 單行程式碼來從文本文件中刪除特定正則表達式的所有實例。

即,我想刪除所有實例

$$ immediately followed by a capital letter, then followed by any number of characters and spaces until $$. 例如,[CP 5.491][MS 283: 56 (variant) in Colapietro, 1989, p. XIV]。 我想在 Perl 中完成此操作,因為我編寫的用於處理我的文件的簡單腳本已經在該語言中。

編輯:

在嘗試了下面兩個完全足夠的答案之後,我意識到我在最初的問題中犯了一個錯誤(對不起!):我還需要刪除左括號後面跟著cf而不是大寫字母的實例,例如[cf. CP 2.282]。我將如何添加該參數?

去除:

  • 一個[字元 ( \[)
  • 緊跟大寫字母([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

引用自:https://unix.stackexchange.com/questions/582518