나는 이것을 한 시간 넘게 조사해 왔지만 왜 작동하지 않는지 찾을 수 없습니다.
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
. 다음을 사용하십시오.
-z
grep
줄 바꿈 대신 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 형식)를 사용합니다 .