<tr> </tr>
html 문서에서 –이 두 태그 사이에있는 것을 검색하고 싶습니다 . 이제 html 파서를 보증하는 특정 html 요구 사항이 없습니다. 나는 단지 일치 <tr>
하고 그 </tr>
사이의 모든 것을 얻는 무언가가 필요 하며 여러 가지가있을 수 있습니다 tr
. 나는 작동하는 awk를 시도했지만 어떤 이유로 든 추출 된 각 행의 복제본이 나옵니다.
awk '
/<TR/{p=1; s=$0}
p && /<\/TR>/{print $0 FS s; s=""; p=0}
p' htmlfile> newfile
어떻게해야합니까?
답변
당신 ...
이 모든 <tr>...</tr>
것을 원한다면 :
grep -o '<tr>.*</tr>' HTMLFILE | sed 's/\(<tr>\|<\/tr>\)//g' > NEWFILE
여러 줄의 경우 :
tr "\n" "|" < HTMLFILE | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g;s/|/\n/g' > NEWFILE
문자 “|”의 첫 번째 HTMLFILE을 확인하십시오. (일반적이지는 않지만 가능) 존재하는 경우 존재하지 않는 것으로 변경하십시오.
답변
HTML 파서를 보증하는 요구 사항이 있습니다. HTML을 구문 분석해야합니다. Perl의 HTML :: TreeBuilder , Python의 BeautifulSoup 등은 사용하기 쉽고 복잡하고 부서지기 쉬운 정규 표현식을 작성하는 것보다 쉽습니다.
perl -MHTML::TreeBuilder -le '
$html = HTML::TreeBuilder->new_from_file($ARGV[0]) or die $!;
foreach ($html->look_down(_tag => "tr")) {
print map {$_->as_HTML()} $_->content_list();
}
' input.html
또는
python -c 'if True:
import sys, BeautifulSoup
html = BeautifulSoup.BeautifulSoup(open(sys.argv[1]).read())
for tr in html.findAll("tr"):
print "".join(tr.contents)
' input.html
답변
sed
그리고 awk
물론이 작업에 적합하지 않습니다, 당신은 오히려 적절한 HTML 파서를 사용해야합니다. 예를 들어 hxselect
w3.org에서 :
<htmlfile hxselect -s '\n' -c 'tr'
답변
ruby
사용 가능한 경우 다음을 수행 할 수 있습니다
ruby -e 'puts readlines.join[/(?<=<tr>).+(?=<\/tr>)/m].gsub(/<\/?tr>/, "")' file
file
입력 HTML 파일은 어디에 있습니까 ? 이 명령은 Ruby one-liner를 실행합니다. 먼저 모든 행을 읽고 file
문자열에 조인합니다 readlines.join
. 그런 다음, 문자열에서 (그러나 포함하지 않음) 사이에 그것을 선택 아무것도 <tr>
및 <\/tr>
그 이상에 관계없이 줄 바꿈 한 문자 또는이다 [/(?<=<tr>).+(?=<\/tr>)/m]
. 그런 다음 문자열에서 <tr>
또는 </tr>
문자열을 제거합니다 gsub(/<\/?tr>/, "")
(중첩 tr
태그 를 처리하는 데 필요함 ). 마지막으로 문자열을 인쇄합니다 puts
.
당신은 HTML 파서 당신을 위해 보증하지 않고, 아주 쉽게 사용할 수 있다고 말했다 노코 기리을 함께 ruby
하고 명령 간단합니다.
ruby -rnokogiri -e 'puts Nokogiri::HTML(readlines.join).xpath("//tr").map { |e| e.content }' file
-rnokogiri
노코 기리 Nokogiri::HTML(readlines.join)
의 모든 줄을 읽습니다 file
. xpath("//tr")
모든 밖으로 픽 tr
요소 map { |e| e.content }
사이에 무엇인지, 즉 각 요소에 대한 내용 밖으로 추천 <tr>
하고 </tr>
.
답변
grep
tr
여러 줄의 태그 내에서 내용을 검색하려면 xargs
먼저 다음과 같이 전달하십시오 .
curl -sL https://www.iana.org/ | xargs | egrep -o "<tr>.*?</tr>"
내부 HTML 만 반환하려면 다음을 사용하십시오.
curl -sL https://www.iana.org/ | xargs | grep -Po "<tr>\K(.*?)</tr>" | sed "s/..tr.//g"
perlre
확장 패턴 구문을 확인하십시오 .
참고 : 더 빠른 성능을 위해 ripgrep
유사한 구문을 사용하는 것을 고려할 수 있습니다 .
답변
pup
pup -f myfile.html tr
태그가없는 텍스트 만 인쇄하려면 다음을 사용하십시오 pup -f myfile.html tr text{}
.
다음은 몇 가지 예입니다 curl
.
curl -sL https://www.iana.org/ | pup tr text{}
pup -f <(curl -sL https://www.iana.org/) tr text{}
xpup
xpup
XPath를 지원하는 HTML / XML 구문 분석을 사용 하는 예 :
xpup -f myfile.html "//tr"
답변
<tr>
s 의 빠른 목록 인 경우 도움이 될 수 있습니다.
perl -ne 'print if /<tr>/../</tr>/' your.html > TRs.log
건배