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
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
grepsă-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 '). -.
geste redundant / lipsit de sens, deoarecesed ' 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.
geste 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
example(sautest) urmați de orice caracter, apoicom. Exempluecho 'exampleAcom' | sed '/example.com/d'