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
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
grephet 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
gis overbodig / zinloos, omdatsed ' 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.
gis mijn gewoonte, je hebt gelijk, het is niet nodig. Ook dacht ik, blanco lijn was wat OP wilde. Nu is alles duidelijk. Bedankt
examplebevat (oftest) gevolgd door een willekeurig teken en vervolgenscom. Voorbeeldecho 'exampleAcom' | sed '/example.com/d'