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
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, 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.
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
example
bevat (oftest
) gevolgd door een willekeurig teken en vervolgenscom
. Voorbeeldecho 'exampleAcom' | sed '/example.com/d'