패턴이 있는 파일이 있어요
<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
레코드 구분 기호로 사용하고 짝수 레코드만 인쇄합니다.