Jag har en fil med en lista med e-postmeddelanden och varje rad har ett e-postmeddelande. Jag vill ta bort rader som innehåller strängen example.com
eller test.com
.
Jag försökte detta:
sed -i "s/example\.com//ig" file.txt
Men det tar bara bort strängen example.com
, hur kan jag ta bort hela raden?
Svar
Med GNU sed:
sed "/example\.com/d;/test\.com/d" -i file.txt
tar bort raderna med example.com
och test.com
.
Från man sed
:
d Delete pattern space. Start next cycle.
Kommentarer
Svar
POSIXly, du kan använda grep
:
grep -Eiv "(example|test)\.com" <in >out
Kommentarer
- Var försiktig så att du inte använder samma fil för in- och utdata , eller så trunkeras den innan
grep
kan läsa den.
Svar
Din regex matchar bara example.com
och sed
ersätter endast example.com
s med tomma sträng. Din regex bör matcha alla rader som innehåller example.com eller test.com
sed -i "s@.*\(test\|example\)\.com.*@@i" file.txt
Kommentarer
- Din svaret raderar inte matchande rader; det gör dem bara tomma. – Det hanterar inte heller skiftlägeskänslig text (enligt OP ' exempel). -.
g
är överflödigt / meningslöst, eftersomsed
' s regex är girig och därför den ledande och efterföljande.*
gör att den första förekomsten av en textmatchning matchar hela raden. - Tack för feedback. Jag har inte ' t uppmärksammat känslighetsfall.
g
är min vana, du har rätt, det är inte nödvändigt. Jag tänkte också att det var OP som ville ha en blank linje. Nu är allt klart. Tack
example
(ellertest
) följ av valfritt tecken sedancom
. Exempelecho 'exampleAcom' | sed '/example.com/d'