verwijder regels die een specifieke tekst bevatten in een bestand

Ik heb een bestand met een lijst met e-mails erin en elke regel bevat een e-mail. Ik wil regels verwijderen die de tekenreeks example.com of test.com bevatten.

Ik heb dit geprobeerd:

sed -i "s/example\.com//ig" file.txt 

Maar het verwijdert alleen de string example.com, hoe kan ik de hele regel verwijderen?

Answer

Met GNU sed:

sed "/example\.com/d;/test\.com/d" -i file.txt 

verwijdert de regels met example.com en test.com.

Van man sed:

d Delete pattern space. Start next cycle. 

Reacties

  • Hiermee wordt ook de regel verwijderd die example bevat (of test) gevolgd door een willekeurig teken en vervolgens com. Voorbeeld echo 'exampleAcom' | sed '/example.com/d'
  • Gah, dwaze ik ben afwezig en ontsnap niet aan de punt. Bedankt voor het opmerken!

Antwoord

POSIXly kunt u grep:

grep -Eiv "(example|test)\.com" <in >out 

Reacties

  • Pas op dat je niet hetzelfde bestand gebruikt voor invoer en uitvoer , of het wordt afgekapt voordat grep het kan lezen.

Antwoord

Uw regex komt alleen overeen met example.com en sed vervangt alleen example.com s door lege draad. Uw regex moet overeenkomen met elke regel die example.com of test.com bevat.

sed -i "s@.*\(test\|example\)\.com.*@@i" file.txt 

Reacties

  • Uw antwoord verwijdert geen overeenkomende regels; het maakt ze alleen leeg. – Het behandelt ook geen hoofdlettergevoelige tekst (zoals in het OP ' s voorbeeld).De g is overbodig / zinloos, omdat sed ‍ ' s regex hebzuchtig is en daarom de voorloop en volg .* zullen ervoor zorgen dat de eerste keer dat een tekstovereenkomst overeenkomt met de hele regel. ‍
  • Bedankt voor uw feedback. Ik heb ' t aandacht besteed aan de gevoeligheid van de hoofdletter. g is mijn gewoonte, je hebt gelijk, het is niet nodig. Ook dacht ik, blanco lijn was wat OP wilde. Nu is alles duidelijk. Bedankt

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *