파일에서 두 \n 사이의 문자열을 추출하는 방법

파일에서 두 \n 사이의 문자열을 추출하는 방법

패턴이 있는 파일이 있어요

    <span class="WebRupee">Rs.</span>\n29\n<br/><font style="font-size:smaller;font-weight:normal">\n3 days\n</font></td>, <td class="pricecell"><span class="WebRupee">Rs.</span>\n59\n<br/><font style="font-size:smaller;font-weight:normal">\n7 days\n</font></td>, <td class="pricecell"><span class="WebRupee">Rs.</span>\n99\n<br/><font style="font-size:smaller;font-weight:normal">\n12 days\n</font></td>

제가 원하는 값은 29, 3일, 59 등 입니다.

기본적으로 사이의 값\n value \n

여러 곳을 살펴봤지만 \n 문자를 이스케이프 처리하는 방법을 모르겠습니다.

나는 시도했습니다: - grep -o '\n.*\n' o.txt 그러나 성공하지 못했습니다.

답변1

Grep은 \n개행 문자를 개행 문자로 해석합니다. 파일에 개행 문자가 없는 것 같습니다. 문자 그대로의 백슬래시를 검색하려면 다음 \과 같이 n두 배로 늘려야 합니다.

$ grep -o '\\n[^\\]*\\n' o.txt
\n29\n
\n3 days\n
\n59\n
\n7 days\n
\n99\n
\n12 days\n

GNU grep을 사용하면 출력을 쉽게 정리하여 제거할 수 있습니다 \n.

$ grep -oP '(?<=\\n)[^\\<>]*(?=\\n)' o.txt
29
3 days
59
7 days
99
12 days

여기서 (?<=\\n)LookBehind 주장은 (?=\\n)우리가 일치하는 텍스트를 둘러싸도록 요구하는 Lookahead 주장입니다 \n. grep은 겹치지 않는 일치 항목을 반환하지만 여기서 한 가지 미묘한 점은 뒤돌아보기와 앞보기가 동일하다는 것입니다.아니요게임에 포함되었습니다. 이로 인해 우리가 원하지 않는 텍스트도 둘러싸여 있다는 문제가 발생합니다 \n. 예를 들어 o.txt에서는 문자가 \n<br/><font style="font-size:smaller;font-weight:normal">\n둘러싸입니다 \n. 이러한 문자열을 제거하려면 일치하는 텍스트에서 및 을 제외할 \뿐만 아니라 제외 해야 합니다 . <>

GNU grep이 없는 경우 또 다른 옵션은 이를 사용하여 sed출력을 정리하는 것입니다.

$ grep -o '\\n[^\\]*\\n' o.txt | sed 's/\\n//g'
29
3 days
59
7 days
99
12 days

또 다른 옵션은 awk를 사용하는 것입니다.

$ awk '0==NR%2' RS='\\\\n' o.txt
29
3 days
59
7 days
99
12 days

여기서 awk는 \후행을 n레코드 구분 기호로 사용하고 짝수 레코드만 인쇄합니다.

관련 정보