명백한 불일치에도 불구하고 Grep은 계속해서

명백한 불일치에도 불구하고 Grep은 계속해서

모두 동일한 패턴을 갖는 줄이 포함된 파일이 있습니다.

Word word word word,more words here,0-9 more words here

첫 번째 쉼표 앞의 첫 번째 단어 집합에 20자 이상의 문자가 포함된 줄을 찾고 싶습니다. 나는 썼다

cat file.txt | grep -E "^[A-Z,a-z,[:space:]]{20,}[,]{1}"

나는 이것이 새로운 줄 표시를 찾은 다음 20자 이상의 일련의 단어를 찾은 다음 쉼표를 찾은 다음 중지한다고 생각합니다. 그 이후의 단어는 줄 바꿈이 없기 때문에 계산되지 않습니다.

그러나 이는 쉼표 뒤의 두 번째 단어 문자열과도 일치합니다. 왜 그럴까요?

도움을 주셔서 감사합니다.

답변1

[A-Z,a-z,[:space:]]A및 사이의 Z로케일 정렬 순서로 정렬된 정렬 요소(여러 문자일 수 있음)와 일치 하거나 문자이거나 및 ,사이에 정렬되거나 문자 이거나 로케일에서 정렬된 공백 문자입니다.az,

,를 제외한 모든 문자를 일치시키 [^,]려면 단어 문자 또는 공백으로 분류된 문자를 일치시키려면 입니다 ( perl 정규식에 해당하는 [[:alpha:][:space:]]에 추가할 수 있음 ). ASCII 문자 또는 ASCII 공백을 일치시키려면 쉘이 지원하는 경우 1입니다 ._[\w\s]$'...'$'[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz \t\r\f\v]'

그래서:

<file.txt grep -E '^[^,]{20,},'

20개 이상의 비 문자 ,로 시작하고 그 뒤에 오는 행 과 일치합니다 ,.

grep(이름은 in 명령에서 따옴) 패턴과 일치하는 행을 인쇄합니다. 이 줄의 일치하는 부분만 인쇄하려면 일부 구현에서 이 옵션을 추가할 수 있습니다(원래 GNU에서). 일부는 색상 지원 터미널로 전송될 때 일치하는 부품을 다른 색상으로 인쇄할 수도 있습니다.g/regular expression/pedgrep-ogrep

그러나 -o/를 사용하는 경우 --color정규식 grep은 여러 번 일치를 시도하고 이전 일치가 끝난 후 줄 부분에서 검색이 반복됩니다. 일부 구현 grep에서는 이를 올바르게 수행하지 않는다는 것을 알게 될 것입니다 . 예를 들어 grepast-open을 사용하면 다음과 같습니다.

$ echo aaa | grep -o '^a'
a
a
a

a이는 줄의 시작 부분에서 찾은 다음 줄의 나머지 부분 ^a에 정규식을 적용하여 더 많은 일치 항목을 계속 찾기 때문입니다 . aaGNU와 busybox에는 grep이 문제가 없습니다.

(이것은 cat파일을 연결하는 명령이므로 cat여기서는 필요하지 않습니다.)


1 ASCII 및개행일명 \n개행 문자는 ^J보통 공백으로 분류되지만 줄 구분 기호이기 때문에 줄 내용에 나타날 수 없으며 매개 변수에서 특별한 의미를 가지며 grep줄에 들어갈 여러 정규 표현식을 구분하는 데 사용할 수 있습니다 . 이므로 여기에 포함하고 싶지 않습니다.

관련 정보