줄 바꿈을 무시하고 파일에서 텍스트를 검색하는 방법은 무엇입니까?


11

파일에서 여러 줄로 나눌 수있는 텍스트를 검색하고 싶습니다. 줄 바꿈을 무시하고 일치하는 줄 범위를 반환하는 grep.

예를 들어을 검색 is an example file하고 다음 파일에서 찾을 것으로 예상합니다.

이다 예제 파일.

선행 또는 후행 공백에 의존하지 말고 모든 형태의 공백을 완전히 무시하는 것이 가장 좋습니다 (이상적으로는 일련의 공백을 단일 공백으로 처리).


하나의 비 이상적인 해결책은 tr '\n' ' ' | grep일치하는 것과 일치하지 않는 것을 구별하지만 일치를 표시하지 않거나 큰 파일을 잘 처리하지 않는 것입니다.



참고로, emacs의 검색은 일을하는 것처럼 보입니다 ( isearch-forward)
Nikana Reklawyks

Vim도 마찬가지 /This\_sis입니다. 자세한 내용 : :help \_s.
lcd047

검색 줄 끝에 다음 줄을 추가하십시오. tr -n "\ n"그러면 새 줄이 모두 제거됩니다. 이 도움을 바랍니다!
Dan Howel

답변:


12

GNU grep는 그것을 할 수 있습니다

grep -z 'is\san\sexample\sfile.' file

주석에서 발생하는 몇 가지 사항을 충족시키기 위해 스크립트에 약간의 수정 사항이 있습니다.

 grep -oz '^[^\n]*\bis\s*an\s*example\s*file\.[^\n]*' file

거대한 파일에 관해서는 메모리 제한에 대한 상상력이 없지만 문제가있는 경우 자유롭게 사용할 수 있습니다 sed

sed '/\bis\b/{
          :1
          N
          /file\.\|\(\n.*\)\{3\}/!b1
         }
     /\<is\s*an\s*example\s*file\./p
     D' file

메모리에 4 줄 (패턴에 4 단어가 있기 때문에)을 넘지 않아야합니다 ( \(\n.*\)\{3\}).


5
내가 알다시피, -z옵션은 grep개행을 일반 텍스트 문자로 취급하고 레코드를 분리하기 위해 널 바이트를 찾도록 지시합니다. 널 바이트가없는 텍스트 파일 (즉, 일반적인 경우)에서는 grep -z전체 파일을 한 줄로 처리합니다. 따라서 (1) 큰 파일을 얼마나 잘 처리 할 수 ​​있는지에 대한 의문이 제기되고 (2) 일치하는 항목을 찾으면 전체 파일을 작성하여 일치하는 위치에 대한 단서를 제공하지 않습니다. 또한 (3) OP는“이상적으로는 일련의 공백을 단일 공간으로 처리하는 것이 이상적”이라고 말 했으므로를 사용 \s+하고 추가 해야 합니다 -E.
G-Man, 'Reinstate

1
@ G-Man 의견을 보내 주셔서 감사합니다. 수정 된 답변을 참조하십시오.
Costas

1
(0) 아 -o; 나는 그것을 잊고있다. 그것을 사용하는 영리한 방법. (1) 새로운 grep답변이 시작됩니다 ^[\n]*. 의 오타입니다 [^\n]*. (2) \s+고의적으로 말했다 .  be\s*little일치 belittle하고 care\s*less일치 careless합니다. 그러나 나는 이것이 사소한 문제라고 생각합니다. 당신이 사용하지 않는 경우에, -E당신은의 "가난한 사람의 버전"를 사용할 수 있습니다 \s+, 즉를 \s\s*. (3) 멋진 sed명령입니다. 빈 줄이 있으면 실패 할 수 있습니다 (따라서 4 워드 문구가 4 줄 이상으로 퍼질 수 있습니다). 추가하여 문제를 해결할 수있었습니다 s/\n\s*\n/\n/.
G-Man, 'Reinstate

@ G-Man 다시 감사합니다. 귀하의 의견은 매우 유용합니다. 유명한 회원들이 저를 밀어 붙이기 때문에 휴대용 코드를 게시하려고 노력했습니다. 어쨌든조차없이 -E사용할 수 당신 스틸 +\s\+양식. 패턴 내부의 빈 줄은 고려 된 것 같습니다.
Costas

나는 RFC 와 같이 페이지가 매겨진 텍스트 문서에 대해 생각하고 있었다 – ISTR 매뉴얼 페이지는 일부 시스템에서 (또는 했던 것처럼 ) 보인다. grep문구를 희망하기 전에 제거해야합니다 .
G-Man, 'Reinstate

7

이 시도:

pcregrep -M '\bThis\s+is\b' <<EOT
This
is
an example
file.
EOT

\s"이것은 매우 긴 패턴입니다"를 검색하면 5 번 을 입력해야 합니까?
Nikana Reklawyks 17

1
예 : 점은 \s공백과 일치하고 줄 바꿈은 "공간"입니다.
lcd047

파일이 This\nis a very\nlong pattern인 경우 어떻게 되고 줄 바꿈이 어디서 발생하는지 알 수 없습니다. 검색해야 This\sis\sa\svery\slong\spattern합니까? (패턴의 길이가 길어 지거나 다른 곳에서 붙여 넣으면 지루해진다)
Nikana Reklawyks

2
그런 다음과 같이하십시오 : pcregrep -M "$( echo 'This is a very long pattern' | sed 's/ /\\s+/g' )" file.
lcd047
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.