rimuovi le righe che contengono un testo specifico in un file

Ho un file con un elenco di email e ogni riga contiene unemail. Voglio rimuovere le righe che contengono la stringa example.com o test.com.

Ho provato questo:

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

Ma rimuoverà solo la stringa example.com, come posso rimuovere lintera riga?

Risposta

Con GNU sed:

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

rimuoverà le righe con example.com e test.com.

Da man sed:

d Delete pattern space. Start next cycle. 

Commenti

  • Questa operazione eliminerà anche la riga contenente example (o test) seguito da un carattere, quindi com. Esempio echo 'exampleAcom' | sed '/example.com/d'
  • Gah, stupido me distrattamente che non sfugge al punto. Grazie per aver notato!

Risposta

POSSIBILMENTE, puoi utilizzare grep:

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

Commenti

  • Fai attenzione a non utilizzare lo stesso file per input e output oppure verrà troncato prima che grep possa leggerlo.

Risposta

La tua espressione regolare trova solo example.com e sed sostituisce solo example.com con vuoto corda. La tua espressione regolare deve corrispondere a qualsiasi riga contenente example.com o test.com

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

Commenti

  • Il tuo la risposta non cancella le righe corrispondenti; li rende solo vuoti. – Inoltre non gestisce il testo senza distinzione tra maiuscole e minuscole (come nellesempio di OP '). -. La g è ridondante / priva di significato, perché sed ‍ ' s regex è avida e quindi il .* iniziale e finale farà sì che la prima occorrenza di una corrispondenza di testo corrisponda allintera riga. ‍
  • Grazie per il feedback. Non ' ho prestato attenzione alla sensibilità alle maiuscole. g è la mia abitudine, hai ragione, non è necessario. Inoltre ho pensato, la linea di soppressione era ciò che voleva OP. Adesso è tutto chiaro. Grazie

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *