eliminați liniile care conțin un anumit text într-un fișier

Am un fișier cu o listă de e-mailuri și fiecare linie are un e-mail în el. Vreau să elimin liniile care conțin șirul example.com sau test.com.

Am încercat acest lucru:

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

Dar va elimina doar șirul example.com, cum pot elimina întreaga linie?

Răspuns

Cu GNU sed:

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

va elimina liniile cu example.com și test.com.

De la man sed:

d Delete pattern space. Start next cycle. 

Comentarii

  • Aceasta va șterge și linia care conține example (sau test) urmați de orice caracter, apoi com. Exemplu echo 'exampleAcom' | sed '/example.com/d'
  • Gah, prostește-mă, absent, fără a scăpa de punct. Vă mulțumim că ați observat!

Răspuns

POSIXly, puteți utiliza grep:

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

Comentarii

  • Aveți grijă să nu utilizați același fișier pentru intrare și ieșire , sau va fi trunchiat înainte ca grep să-l poată citi.

Răspuns

Regexul tău se potrivește numai cu example.com și sed înlocuiește numai example.com s cu goluri şir. Regexul dvs. trebuie să se potrivească cu orice linie care conține example.com sau test.com

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

Comentarii

  • răspunsul nu șterge liniile potrivite; le face doar goale. – De asemenea, nu gestionează textul care nu face sensibilitate la majuscule (ca în exemplul OP '). -. g este redundant / lipsit de sens, deoarece sed ‍ ' regex este lacom și, prin urmare, .* principal și final va face ca prima apariție a unei potriviri text să se potrivească cu întreaga linie. ‍
  • Vă mulțumim pentru feedback. ' nu am acordat atenție sensibilității la majuscule. g este obiceiul meu, ai dreptate, nu este necesar. De asemenea, m-am gândit că oprirea liniei era ceea ce OP dorea. Acum totul este clar. Mulțumesc

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *