fjern linjer som inneholder en spesifikk tekst i en fil

Jeg har en fil med en liste over e-postmeldinger, og hver linje har en e-postmelding. Jeg vil fjerne linjer som inneholder strengen example.com eller test.com.

Jeg prøvde dette:

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

Men det vil bare fjerne strengen example.com, hvordan kan jeg fjerne hele linjen?

Svar

Med GNU sed:

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

fjerner linjene med example.com og test.com.

Fra man sed:

d Delete pattern space. Start next cycle. 

Kommentarer

  • Dette vil også slette linjen inneholder example (eller test) følg med et hvilket som helst tegn og deretter com. Eksempel echo 'exampleAcom' | sed '/example.com/d'
  • Gah, dumt meg fraværende uten å rømme prikken. Takk for at du la merke til det!

Svar

POSIXly, du kan bruke grep:

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

Kommentarer

  • Vær forsiktig så du ikke bruker den samme filen til input og output , eller det blir avkortet før grep kan lese det.

Svar

Regexen din samsvarer bare med example.com og sed erstatter bare example.com s med tomme streng. Regexen din skal samsvare med en hvilken som helst linje som inneholder example.com eller test.com

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

Kommentarer

  • Din svaret sletter ikke samsvarende linjer; det gjør dem bare blanke. – Den håndterer heller ikke store og små bokstaver (i henhold til OP ' s eksempel). -. g er overflødig / meningsløs, fordi sed ‍ ' s regex er grådig og derfor den ledende og etterfølgende .* vil føre til at den første forekomsten av et tekstmatch samsvarer med hele linjen. ‍
  • Takk for tilbakemeldingen. Jeg har ikke ' ikke tatt hensyn til saksfølsomhet. g er min vane, du har rett, det er ikke nødvendig. Også jeg trodde at blanking linje var det OP ønsket. Nå er alt klart. Takk

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *