eliminar líneas que contienen un texto específico en un archivo

Tengo un archivo con una lista de correos electrónicos y cada línea tiene un correo electrónico. Quiero eliminar las líneas que contienen la cadena example.com o test.com.

Intenté esto:

sed -i "s/example\.com//ig" file.txt 

Pero solo eliminará la cadena example.com, ¿cómo puedo eliminar toda la línea?

Responder

Con GNU sed:

sed "/example\.com/d;/test\.com/d" -i file.txt 

eliminará las líneas con example.com y test.com.

De man sed:

d Delete pattern space. Start next cycle. 

Comentarios

  • Esto también eliminará la línea que contiene example (o test) seguido de cualquier carácter, luego com. Ejemplo echo 'exampleAcom' | sed '/example.com/d'
  • Gah, tonta de mí distraídamente sin escapar del punto. ¡Gracias por darte cuenta!

Responder

POSIXly, puedes usar grep:

grep -Eiv "(example|test)\.com" <in >out 

Comentarios

  • Tenga cuidado de no utilizar el mismo archivo para entrada y salida o se truncará antes de que grep pueda leerlo.

Responder

Su expresión regular solo coincide con example.com y sed reemplaza solo example.com s con vacío cuerda. Su expresión regular debe coincidir con cualquier línea que contenga example.com o test.com

sed -i "s@.*\(test\|example\)\.com.*@@i" file.txt 

Comentarios

  • Su la respuesta no elimina las líneas coincidentes; solo los deja en blanco. – Tampoco maneja texto que no distingue entre mayúsculas y minúsculas (según el ejemplo de OP ' s). -. El g es redundante / sin sentido, porque sed ‍ ' s regex es codicioso y por lo tanto el .* inicial y final hará que la primera aparición de una coincidencia de texto coincida con la línea completa. ‍
  • Gracias por sus comentarios. No he ' t prestado atención a la sensibilidad a mayúsculas y minúsculas. g es mi costumbre, tienes razón, no es necesario. También pensé que OP quería una línea en blanco. Ahora todo está claro. Gracias

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *