정규식에서 LF 문자를 처리하기 위해 GNU grep 2.12를 얻을 수 없습니다

정규식에서 LF 문자를 처리하기 위해 GNU grep 2.12를 얻을 수 없습니다

나는 이것을 한 시간 넘게 조사해 왔지만 왜 작동하지 않는지 찾을 수 없습니다.

HTML 문서에서 "\nSome text"를 검색하고 있습니다. 충분히 간단합니다.

그러나 그가 실행한 명령은 작동하지 않습니다.

grep -Po '(?s)<h2>\nSome text' input.html > output.html
grep -Po '(?s)<h2>\\nSome text' input.html > output.html

grep의 기본 정규식 엔진은 여러 줄을 지원하지 않기 때문에 "-P" 스위치가 필요합니다.

나는 무엇을 더 시도해야할지 모르겠습니다. 어떤 아이디어가 있나요?

감사해요.

-- 편집: 입력 파일에는 다음 항목만 포함됩니다.

<h2>LF (ie. \n)
Some text

답변1

개행(따라서 여러 줄)을 일치시키려면 두 가지가 필요합니다 grep. 다음을 사용하십시오.

  • -zgrep줄 바꿈 대신 ASCII NUL로 줄을 구분하는 최신 GNU 옵션

  • (?s)DOTALL 수정자( grep -P)라고 하며, 결과적으로 grep개행 문자(LF/CR)와 일치 .(점) 됩니다.

따라서 귀하의 경우 다음이 작동합니다.

grep -aPoz '(?s)<h2>.Some text' file.txt

새로운 줄이 여기서 .일치됩니다 .

CR 및 LF가 있거나 확실하지 않은 경우:

grep -aPoz '(?s)<h2>.{1,2}Some text' file.txt

grep처음 몇 바이트를 읽어 파일 형식을 결정하므로 파일은 바이너리 파일로 처리되어 파일 이 텍스트 파일로 처리됩니다 grep.-a

답변2

grep은 기본적으로 줄을 검색하므로 일반적으로 줄 사이의 문자를 찾는 데 사용할 수 없습니다.

개행 문자를 검색할 때 일반적으로 개행 문자(여기서는 UNIX 개행 문자라고 가정)를 다음과 같이 텍스트에 없는 다른 문자로 바꿉니다.

cat file.html | sed 's/\n/%\n/g' | grep '<h2>%' | tr --delete % 

그러나 내가 보기에는 줄 끝에서 검색하고 있는 것 같습니다. 다음과 같이 검색할 수 있습니다.

grep '<h2>$' file.html > newfile.html

$줄의 끝(줄의 시작과 일치)과 일치하는 ^정규식(7) 이기 때문 입니다.

편집: 내가 착각한 경우(내가 의심하는 경우) <h2>\nSome text다음과 같이 시도해야 합니다.

cat file.html | sed 's/<h2>\n/ñ/g' | grep 'ñSome text' | sed 's/ñ/<h2>\n/g' > newfile.html

ñ텍스트의 실제 s와 다른 문자(UTF-8 시퀀스)를 사용하세요 .ñ

또는 다음 조합을 시도해 보세요.

cat file.html | tr \\n % | sed 's/<h2>%/ñ/g' | tr % \\n | grep 'ñSome text' | sed 's/ñ/<h2>\n/g'

%파일에서는 사용되지 않으므로 단일 문자(UTF-8 형식)를 사용합니다 .

관련 정보