텍스트 파일에서 특정 정규식의 모든 인스턴스를 제거하기 위해 올바른 한 줄 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