검색해서 이 두 가지 주제를 찾았는데 공백 수가 고정되어 있기 때문에 서로 다릅니다. 반면 제 샘플에는 공백 수가 고정되어 있지 않습니다.
https://stackoverflow.com/questions/47428445/i-want-grep-to-grep-one-word-which-is-having-spaces-it
https://askubuntu.com/questions/949326/how-to-include-a-space-character-with-grep
예시 텍스트:
<span>Section 1: Plan your day, write out your plan</span>
원하는 출력:
Section 1: Plan your day, write out your plan
HTML 태그가 아닌 텍스트만 grep하고 싶습니다. 이것이 나의 시도이다.
wolf@linux:~$ cat file.txt
<span>Section 1: Plan your day, write out your plan</span>
wolf@linux:~$
wolf@linux:~$ grep -oP 'S\S+ \d: \S+' file.txt
Section 1: Plan
wolf@linux:~$
wolf@linux:~$ grep -oP 'S\S+ \d: \S+ \S+' file.txt
Section 1: Plan your
wolf@linux:~$
\S+
텍스트의 길이가 다르기 때문에 하나씩 정의하는 것보다 더 나은 솔루션이 있습니까?
답변1
확장 정규 표현식을 사용하여 Section
키워드를 고정하고 뒤에 오지 않는 모든 항목을 가져옵니다 <
.
$ grep -E -o 'Section [0-9]+:[^<]*' < file.txt
Section 1: Plan your day, write out your plan
Perl을 사용하여 주변 부분을 고정하는 것이 가장 쉬운 방법이므로 이것이 옵션인 경우:
$ perl -lne 'print $1 if m,<span>(Section \d+:.*?)</span>,' < file.txt
Section 1: Plan your day, write out your plan
(유사한 작업을 수행하는 데 사용할 수 있는 몇 가지 방법이 있지만 grep -P
읽기가 약간 어렵습니다.)
답변2
HTML이 유효한 XML인 경우 xmlstarlet
이를 사용하여 적절한 요소 값을 선택할 수 있습니다.
xmlstarlet sel -t -v '//span' -n file.html
Section 1: Plan your day, write out your plan
더 많은 페이지 구조 없이는 더 나은 XPath()를 제공할 수 없습니다 //span
. 하지만 예 span
를 div
들어 //div/span
.
답변3
sum 이외의 문자 시퀀스와 일치시키려는 것 같으니 다음과 같이 <
하십시오 .>
<number>:
grep -Po '[^<>]* \d+:[^<>]*'
답변4
Perl Look(ahead|behind)이 도움이 될 수 있습니다:
grep -Po "(?<=>).+(?=</)" yourfile
이는 html 태그 사이의 모든 항목과 일치하고 해당 태그를 제거합니다.