sed: cómo eliminar todas las líneas que no coinciden

12

Tengo un archivo html. Quiero eliminar todas las líneas que no comienzan con <tr>.

Lo intenté:

cat my_file | sed $'
s/^[^tr].*//
' | sed '/^$/d'

pero eliminó todas las líneas.

Michael Durrant
fuente
3
Más fácil con grep.
jcbermu
1
s/^[^tr]...coincide con líneas que comienzan con cualquier carácter que no sea to r. Los corchetes son un rango de caracteres en una expresión regular.
Peter Cordes

Respuestas:

18

Pruebe esto con GNU sed:

sed -n '/^<tr>/p' file

o

sed '/^<tr>/!d' file
Ciro
fuente
1
Encuentro la versión con !dparticularmente útil porque le permite escribir otro comando sed dentro de la expresión, mientras que el púnico imprime la coincidencia, pero el siguiente comando tiene la entrada sin modificar.
jirislav
9
sed -e '/^<tr>/d'

La parte intermedia /es una expresión regular. El dcomando elimina líneas coincidentes.

Actualización: ¡Uy, lo siento, vi que dijiste NO. Entonces

sed -e '/^<tr>/!d'

Donde !niega el sentido del partido.

usuario3188445
fuente
3

Si tiene que ser sed:

sed -ni '/^<tr>/p' file

-iedita el archivo en el lugar, -nevita sedimprimir todas las líneas, la expresión regular significa hacer coincidir todas las líneas que comienzan con ( ^) <tr>y esas líneas se imprimirán ( p).

Con grep:

grep -E '^<tr>' file

Con -Egrep interpreta expresiones regulares extendidas.

Con awk:

awk '/^<tr>/' file

O puro bash:

while IFS= read -r l; do [[ "$l" =~ ^\<tr\> ]] && echo $l; done <file

La [[expresión condicional interna es bashs. Comparamos $lcon la expresión regular y si tuvo éxito ( &&) imprimimos la línea con echo.

caos
fuente
Su versión pura fiesta deja de citar "$l". Y lo está poniendo como el primer argumento en echola línea de comandos, por lo que tendrá un problema si comienza con a -option. (Usar printf '%s\n' "$l"). Also, shell read` tiene que leer un byte por vez, por lo que es súper lento. Procesar archivos de texto en bash puro generalmente no es una buena opción a menos que sepa que su archivo es muy pequeño.
Peter Cordes
2

La respuesta más fácil y sencilla sería:

grep '^<tr>' path/to/file 

Esto imprimirá el archivo con solo las líneas que comienzan con lo que podría ser bueno si no desea modificar el archivo directamente (como con sed).

Luego, si le gusta lo que ve en la salida, puede imprimirlo en un archivo con > file

En este caso, ahorrará algo de tiempo haciendo una copia de seguridad de su archivo antes de intentar algunos comandos.

VaTo
fuente