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