fjern linjer, der indeholder en bestemt tekst i en fil

Jeg har en fil med en liste over e-mails i den, og hver linje har en e-mail i den. Jeg vil fjerne linjer, der indeholder strengen example.com eller test.com.

Jeg prøvede dette:

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

Men det fjerner kun strengen example.com, hvordan kan jeg fjerne hele linjen?

Svar

Med GNU sed:

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

fjernes linjerne med example.com og test.com.

Fra man sed:

d Delete pattern space. Start next cycle. 

Kommentarer

  • Dette sletter også linjen, der indeholder example (eller test) følg med et hvilket som helst tegn derefter com. Eksempel echo 'exampleAcom' | sed '/example.com/d'
  • Gah, fjollet mig fraværende uden at undslippe prikken. Tak for din opmærksomhed!

Svar

POSIXly, du kan bruge grep:

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

Kommentarer

  • Pas på ikke at bruge den samme fil til input og output , ellers trunkeres den inden grep kan læse den.

Svar

Din regex matcher kun example.com og sed erstatter kun example.com s med tomme snor. Din regex skal matche enhver linje, der indeholder example.com eller test.com

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

Kommentarer

  • Din svaret sletter ikke matchende linjer; det gør dem kun tomme. – Det håndterer heller ikke store og små bogstaver (som beskrevet i eksempelet OP '). -. g er overflødig / meningsløs, fordi sed ‍ ' s regex er grådig og derfor den førende og efterfølgende .* får den første forekomst af et tekstmatch til at matche hele linjen. ‍
  • Tak for feedback. Jeg har ikke ' t opmærksom på sagsfølsomhed. g er min vane, du har ret, det er ikke nødvendigt. Jeg tænkte også, at blanke linjer var, hvad OP ønskede. Nu er alt klart. Tak

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *