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.htmlSalida 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 ipsumSalida deseada:
<b>2021-07-21:</b> Lorem ipsum <b>2021-07-19:</b> Lorem ipsum <b>2021-07-10:</b> Lorem ipsumSé 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?
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_fileExplicació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.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 ipsumSupongo 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.
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