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