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

관련 정보