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