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
grepkan 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'