Eu quero recuperar o que estiver entre essas duas tags - <tr> </tr>
- de um documento html. Agora não tenho requisitos específicos de html que justifiquem um analisador de html. Eu simplesmente precisa de algo que partidas <tr>
e </tr>
e fica tudo entre eles e poderia haver vários tr
s. Tentei o awk, o que funciona, mas, por algum motivo, acaba me fornecendo duplicatas de cada linha extraída.
awk '
/<TR/{p=1; s=$0}
p && /<\/TR>/{print $0 FS s; s=""; p=0}
p' htmlfile> newfile
Como fazer isso?
shell-script
text-processing
sed
awk
html
TechJack
fonte
fonte
'/<tr/{p=1}; p; /<\/tr>/{p=0}'
. Poste algum exemplo de entrada e saída esperada se não funcionar.awk
está funcionando, mas dando duplicatas tentar passar a saída do seu awk desort -u
levá-los distintaRespostas:
Se você quer apenas
...
de todos,<tr>...</tr>
faça:grep -o '<tr>.*</tr>' HTMLFILE | sed 's/\(<tr>\|<\/tr>\)//g' > NEWFILE
Para multilinhas, faça:
tr "\n" "|" < HTMLFILE | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g;s/|/\n/g' > NEWFILE
Verifique o HTMLFILE primeiro do caractere "|" (não usual, mas possível) e, se existir, mude para um que não existe.
fonte
echo "bla<tr>foo</tr>bla<tr>bar</tr>bla" | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g'
dáfooblabar
. Obla
não deveria estar lá?grep -Po '<tr>.*?</tr>'
retornaria um resultado por linha no caso da @ NN, mas não é portátil.Você tem um requisito que justifique um analisador de HTML: você precisa analisar o HTML. O HTML :: TreeBuilder do Perl , o BeautifulSoup do Python e outros são fáceis de usar, mais fáceis do que escrever expressões regulares complexas e quebradiças.
ou
fonte
sed
eawk
não são adequados para esta tarefa, você deve usar um analisador de html adequado. Por exemplo,hxselect
do w3.org:fonte
hxselect
faz um bom trabalho com documentos html / xml bem formados. Além disso, é mais rápido de usar do que perl, python e outros. Eu acho quehxselect
é um bom meio termo entresed
/awk
e as bibliotecas do analisador.hxselect
parece ser bom, definitivamente o explorará mais. Obrigado.hxnormalize
cuida de arquivos html / xml não bem formados.Se
ruby
estiver disponível, você pode fazer o seguinteOnde
file
está o seu arquivo html de entrada. O comando executa uma linha única do Ruby. Primeiro, ele lê todas as linhas defile
e as une a uma stringreadlines.join
. Em seguida, a partir da string seleciona qualquer coisa entre (mas não incluindo)<tr>
e<\/tr>
esse é um caractere ou mais, independentemente de novas linhas[/(?<=<tr>).+(?=<\/tr>)/m]
,. Em seguida, ele remove qualquer<tr>
ou</tr>
da stringgsub(/<\/?tr>/, "")
(isso é necessário para manipulartr
tags aninhadas ). Finalmente, imprime a stringputs
.Você disse que um parser html não é garantido para você, mas é muito fácil de usar Nokogiri com
ruby
e faz o comando mais simples.-rnokogiri
carrega Nokogiri.Nokogiri::HTML(readlines.join)
lê todas as linhas defile
.xpath("//tr")
seleciona cadatr
elemento emap { |e| e.content }
o conteúdo de cada elemento, ou seja, o que está entre<tr>
e</tr>
.fonte
grep
Para recuperar o conteúdo dentro da
tr
tag em várias linhas, passe-oxargs
primeiro, por exemplo:Para retornar apenas HTML interno, use:
Verifique a sintaxe para
perlre
padrões estendidos .Nota: Para obter um desempenho mais rápido, considere
ripgrep
qual possui sintaxe semelhante.fonte
pup
Exemplo de uso
pup
(que usa seletores CSS ):Para imprimir apenas texto sem marcas, use:
pup -f myfile.html tr text{}
.Aqui estão alguns exemplos com
curl
:xpup
Exemplo
xpup
de análise de HTML / XML (que suporta XPath):fonte
se for apenas uma lista rápida de
<tr>
s, isso pode ajudar:Felicidades
fonte