ta bort rader som innehåller en specifik text i en fil

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

  • Detta tar också bort rad som innehåller example (eller test) följ av valfritt tecken sedan com. Exempel echo 'exampleAcom' | sed '/example.com/d'
  • Gah, dumt mig utan att komma undan punkten. Tack för att du märkte det!

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, eftersom sed ‍ ' 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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *