¿Cómo extraer contenido div usando grep?

Aug 24 2020

Necesito extraer contenido div específico dentro del archivo.

El contenido es el siguiente.

<div class="container">
    <div class="row">
        <div class="col-2">One of three columns</div>
        <div class="col-6">
            <p>One of three columns</p>
        </div>
        <div class="col-4">One of three columns</div>
    </div>
</div>

El siguiente contenido necesita ser extraído.

<div class="col-6">
    <p>One of three columns</p>
</div>

Intento hacer esto.

cat test.html | tr -d '\n\t' | grep -o "<div class=\"col-6\">.*<\/div><div class=\"col-4\">"

Regresa de la siguiente manera.

<div class="col-6"><p>One of three columns</p></div><div class="col-4">

¿Cómo elimino el antes y el después del contenido?

<div class="col-6">...</div><div class="col-4">

¡Gracias de antemano!

Respuestas

3 pLumo Aug 24 2020 at 15:16

Usargrep -A

$ grep -A 2 'class="col-6"' test.html | sed -n 2p
        <p>One of three columns</p>

de man grep:

-A NUM, --after-context=NUM
Imprime NUMlíneas de contexto final después de las líneas coincidentes.

o usar awk:

$ awk '/class="col-6"/{getline; print $0}' test.html
        <p>One of three columns</p>

Nota: Esto funciona solo si la estructura permanece exactamente como su entrada de prueba. En general, siempre preferiría un analizador xml / html adecuado.

pythonpor ejemplo beautifulsoup:

$ python3 -c '
from bs4 import BeautifulSoup
with open("test.html") as fp:
    soup = BeautifulSoup(fp)
print(soup.findAll("div", {"class":"col-6"})[0].findAll("p")[0])'
<p>One of three columns</p>

O usando xmlstarletasí:

$ xmlstarlet sel -t -m '//div[@class="col-6"]' -c './p' -n test.html
<p>One of three columns</p>