괄호로 시작하고 끝나는 문자열에 대한 정규식

괄호로 시작하고 끝나는 문자열에 대한 정규식

infile.txt다음 문자열이 포함된 텍스트 파일이 있습니다.

[ A ]
1
2
[ B ]
3
[ C
4
5 
[ D ]

grep나는 둘 다 사용 하고 로 시작하고 끝나는 줄을 인쇄하고 싶습니다 sed. 그래서 내가 원하는 결과는 다음과 같습니다.[]grepsed

[ A ]
[ B ]
[ D ]

현실 확인을 위해 먼저 다음을 포함하는 줄을 인쇄해 보겠습니다 [.

grep "\[" infile.txt
grep -E "\[" infile.txt
sed -n '/\[/p' infile.txt
sed -nE '/\[/p' infile.txt

이전 명령 각각은 다음과 같은 출력을 제공합니다.

[ A ]
[ B ]
[ C
[ D ]

[이제 인쇄된 줄이 시작 되고 끝나는 위치를 지정해야 합니다 ].이 답변도착하다이 문제정규식을 사용하는 것이 좋습니다 \[[^\]]*\]. 그러나 다음 명령은 모두 출력을 제공하지 않습니다(빈 문자열).

grep "\[[^\]]*\]" infile.txt
grep -E "\[[^\]]*\]" infile.txt
sed -n '/\[[^\]]*\]/p' infile.txt
sed -nE '/\[[^\]]*\]/p' infile.txt

그러나 다음 각 명령은 ...

grep "\[*\]" infile.txt
grep -E "\[*\]" infile.txt
sed -n '/\[*\]/p' infile.txt
sed -nE '/\[*\]/p' infile.txt

...원하는 출력을 제공합니다.

[ A ]
[ B ]
[ D ]

정규 표현식이 그렇지 않은 이유 \[[^\]]*\]- 다시 말하지만,이 답변도착하다이 문제-- 내 텍스트에 맞는가?

답변1

grep -x '\[.*\]'

[( )로 시작하고 ( )로 끝나는 줄을 일치시키는 데 충분해야 합니다 ( 그 사이에 ( ) 문자( )를 ]자유롭게 포함 ).*.

-x실제로는 ^시작과 끝에 $암시적 내용을 추가하므로 다음과 같습니다.

grep '^\[.*\]$'

ERE와 동일 또는 sed:

grep -xE '\[.*\]'
grep -E '^\[.*\]$'
sed '/^\[.*\]$/!d'
sed -n '/^\[.*\]$/p'
sed -E '/^\[.*\]$/!d'
sed -En '/^\[.*\]$/p'

당신의:

\[[^\]]*\]

[a 뒤에 백슬래시() 이외의 문자가 오고 그 [^\]뒤에 임의 개수의 ]문자가 오고 그 뒤에 가 옵니다 ].

뒤에 오는 or 를 [제외하고 임의의 수의 문자를 일치시키려면 구문은 or 입니다. 왜냐하면 이스케이프가 필요하지 않기 때문입니다 . 하지만 필요한 경우 regex 또는 glob 스타일을 사용하여 이를 권장합니다.]]\[[^]]*\]\[[^]]*]]

[...]표준 BRE 또는 ERE(제외 awk) 에서는 \특별한 것이 없습니다. 하지만 특별한 정규식 변형이 있으므로 예를 [\\x]들어 [\x]to match \또는 x.

정규 표현식은 다양한 형태로 제공됩니다. 그 안에 있는 사람들https://regexr.com/귀하가 링크한 답변에서 볼 수 있듯이 (일부 버전의) PCRE(perl 호환 정규 표현식)가 나타납니다. 그 중 일부는 대괄호 표현식을 이스케이프하는 데 사용할 수 있는 or 및 where를 구현 grep하거나 sed지원합니다 .-P-R-x perl\]

또한보십시오:내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?


1이며 현재 POSIX의 최신 버전에 있는 것이 보장되지만, 이는 뚜렷한 이유 없이 진행을 차단하므로 향후 변경될 수 있습니다. 예를 들어 TAB 에서 일치하는 환경이 아닌 경우 또는 POSIX에서 요구하는 경우와 같이 일부 구현에서는 sed이 요구 사항을 무시한다는 것을 알 수 있습니다 . 또는 일치하려면 휴대용을 사용하십시오 .$POSIXLY_CORRECT[\t]\t\t[\\t]

답변2

RE를 디코딩하자\[[^\]]*\]

  • \[- 텍스트 [문자
  • [^\]- 아니요\
  • ]- 텍스트 ]문자
  • *- 이전 항목이 0번 이상 반복됩니다. 즉, ]0번 이상 반복됩니다.
  • \]- 또 다른 리터럴 ]문자(여기서는 백슬래시가 무시됩니다)

이것을 적용해 보면 [ A ]일치하지 않는 것을 알 수 있습니다. 나는 당신이 묻는 질문이 왜 [^\]]이런 일을하는지 의심합니다. 음수 기호에는 특별한 경우가 있습니다 ^. 다음 기호가 ]문자 그대로 처리되면, 그렇지 않으면 항상 구조의 끝이 됩니다 [...].

대신에 이 RE를 사용하고 \[[^]*]문자열의 앞부분과 뒷부분을 고정할 수도 있습니다.^\[.*]$

관련 정보