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
grepkan 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 '). -.
ger 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.
ger 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'