Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

307
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!