infile.txt
다음 문자열이 포함된 텍스트 파일이 있습니다.
[ A ]
1
2
[ B ]
3
[ C
4
5
[ D ]
grep
나는 둘 다 사용 하고 로 시작하고 끝나는 줄을 인쇄하고 싶습니다 sed
. 그래서 내가 원하는 결과는 다음과 같습니다.[
]
grep
sed
[ 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를 사용하고 \[[^]*]
문자열의 앞부분과 뒷부분을 고정할 수도 있습니다.^\[.*]$