이 grep 문이 내가 예상한 것과 반대되는 효과를 갖는 이유는 무엇입니까?

이 grep 문이 내가 예상한 것과 반대되는 효과를 갖는 이유는 무엇입니까?

일부 HTML과 일부 텍스트가 혼합된 파일이 있는데 텍스트 줄만 필요합니다.

나는 grepHTML 태그로 시작하는 줄, 심지어 태그 앞에 공백이 포함된 줄을 제외하는 방법을 찾으려고 애쓰고 있습니다.

어떻게 든 이것은 나에게 효과적이지만 그렇게해서는 안된다고 생각합니다.

grep '^\<' file.htm

HTML이 없는 행만 표시합니다. 이유를 설명해 주실 수 있나요? 내 생각엔 이 일을 할 수 있는 곳 grep -v이 필요한 것 같아 .*.

답변1

~에서GNU grep매뉴얼:

\<
단어 시작 부분의 빈 문자열과 일치합니다.

\>
단어 끝의 빈 문자열과 일치합니다.

이것은 또한 관련이 있습니다 [강조 광산]:

-w
--word-regexp
전체 단어를 구성하는 항목이 포함된 행만 선택하십시오. 테스트에서는 일치하는 하위 문자열이 줄의 시작 부분에 있거나 단어를 만들지 않는 문자가 앞에 있어야 한다는 것입니다. 다시 말하지만, 줄 끝에 있어야 하거나 단어를 형성하지 않는 문자가 뒤에 와야 합니다.단어를 구성하는 문자는 문자, 숫자, 밑줄입니다.[…]

이 옵션은 단어 구성 요소로 시작하고 끝나지 않는 하위 문자열과 일치할 수 있으므로 및 주변 정규식과 -w다릅니다 . 예를 들어, 포함된 줄만 일치 하더라도 단어 구성 요소가 아니기 때문에 어떤 줄 과 도 일치할 수 없습니다 . […]\<\>grep -w @@grep '\<@\>'@

완전성을 위해:

캐럿 ^및 달러 기호는 $각각 줄의 시작과 끝에서 빈 문자열과 일치하는 메타 문자입니다. 일치 항목을 각각 줄의 시작이나 끝 부분에 "고정"시키므로 앵커 포인트라고 합니다.

사용하는 패턴( ^\<)은 단어를 구성하는 문자 앞의 줄 시작과 일치합니다. 문자나 공백은 <단어의 일부가 아닙니다.

줄 시작 부분의 공백은 일치를 트리거하지 않습니다.에도 불구하고뒷면에 라벨이나 무언가가 있는 경우. 텍스트 줄에 유효한 특정 문자(예 (: )도 일치를 트리거하지 않습니다.

관련 정보