Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

308
Visualizações
Solución alternativa de coincidencia no codiciosa multilínea de Awk

Estoy tratando de extraer el contenido de una lista HTML usando awk. Algunas entradas de la lista son de varias líneas.

Ejemplo de lista de entrada:

 <ul> <li> <b>2021-07-21:</b> Lorem ipsum </li> <li> <b>2021-07-19:</b> Lorem ipsum </li> <li><b>2021-07-10:</b> Lorem ipsum</li> </ul>

Comando que estoy usando:

 awk -v RS="" '{match($0, /<li>(.+)<\/li>/, entry); print entry[1]}' file.html

Salida de corriente:

 <b>2021-07-21:</b> Lorem ipsum </li> <li> <b>2021-07-19:</b> Lorem ipsum </li> <li><b>2021-07-10:</b> Lorem ipsum

Salida deseada:

 <b>2021-07-21:</b> Lorem ipsum <b>2021-07-19:</b> Lorem ipsum <b>2021-07-10:</b> Lorem ipsum

Sé que el problema se debe a que las entradas de la lista no están separadas por líneas vacías. Pensé en usar coincidencias no codiciosas, pero aparentemente Awk no lo admite. ¿Existe una posible solución?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Con sus muestras mostradas, intente seguir el código awk . Escrito y probado en GNU awk .

 awk -v RS='</li>' ' match($0,/<li>.*/){ val=substr($0,RSTART,RLENGTH) gsub(/<li>\n*[[:space:]]*|\n*[[:space:]]*$/,"",val) print val } ' Input_file

Explicación: agregando una explicación detallada de lo anterior.

 awk -v RS='</li>' ' ##Starting awk program from here and setting RS as </li> here. match($0,/<li>.*/){ ##Matching <li> till end of line here. val=substr($0,RSTART,RLENGTH) ##Creating val which has matched regex value here. gsub(/<li>\n*[[:space:]]*|\n*[[:space:]]*$/,"",val) ##Globally substituting <li> followed by 0 or more new lines followed by 0 or more spaces OR substituting ending new lines or spaces with NULL in val. print val ##Printing val here. } ' Input_file ##Mentioning Input_file name here.
over 4 years ago · Santiago Trujillo Relatório

0

Con GNU awk para RS multi-char y la abreviatura \s para [[:space:]] :

 $ awk -v RS='\\s*</?li>\\s*' '!(NR%2)' file <b>2021-07-21:</b> Lorem ipsum <b>2021-07-19:</b> Lorem ipsum <b>2021-07-10:</b> Lorem ipsum

Supongo que realmente no desea que se muestre el espacio en blanco inicial en el resultado esperado en su pregunta o no le importa si está presente o no.

over 4 years ago · Santiago Trujillo Relatório

0

Bueno, aquí hay un Perl:

 perl -0777 -nE 'say $1 while(/<li>\s*([\s\S]*?)\s*<\/li>/g)' file <b>2021-07-21:</b> Lorem ipsum <b>2021-07-19:</b> Lorem ipsum <b>2021-07-10:</b> Lorem ipsum
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda