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
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
grepkan 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). -.
ger overflødig / meningsløs, fordised ' 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.
ger 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
example(ellertest) følg med et hvilket som helst tegn og derettercom. Eksempelecho 'exampleAcom' | sed '/example.com/d'