私はテキストファイルから特定の正規表現のすべてのインスタンスを削除するために正しい1行のPerlコードを探しています。
つまり、[ の後に大文字、 ] までの文字とスペースが続くすべてのインスタンスを削除したいのです。たとえば、[CP 5.491]
または[MS 283: 56 (variant) in Colapietro, 1989, p. XIV]
。
ファイルを処理するために書いた単純なスクリプトはすでにその言語を使用しているので、Perlでこれをやりたかったのです。
編集する:
以下の2つの完全に適切な答えを試した後、元の質問で間違いを犯したことに気づきました(申し訳ありません!)。また、開い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