Mám soubor se seznamem e-mailů a každý řádek obsahuje e-mail. Chci odstranit řádky, které obsahují řetězec example.com
nebo test.com
.
Zkusil jsem to:
sed -i "s/example\.com//ig" file.txt
Bude však odstraněn pouze řetězec example.com
, jak mohu odstranit celý řádek?
Odpověď
S GNU sed:
sed "/example\.com/d;/test\.com/d" -i file.txt
odstraní řádky s example.com
a test.com
.
Z man sed
:
d Delete pattern space. Start next cycle.
Komentáře
Odpovědět
POSIXně můžete použít grep
:
grep -Eiv "(example|test)\.com" <in >out
Komentáře
- Dávejte pozor, abyste pro vstup a výstup nepoužívali stejný soubor , nebo bude zkrácen, než si to
grep
přečte.
Odpovědět
Váš regulární výraz odpovídá pouze example.com
a sed
nahrazuje pouze example.com
s prázdnými tětiva. Váš regulární výraz by měl odpovídat libovolnému řádku obsahujícímu example.com nebo test.com.
sed -i "s@.*\(test\|example\)\.com.*@@i" file.txt
Komentáře
- Vaše odpověď nevymaže odpovídající řádky; jen je činí prázdnými. – Nezpracovává také malá a velká písmena (podle příkladu OP '). -.
g
je nadbytečný / nesmyslný, protožesed
' s regex je chamtivý, a proto úvodní a koncové.*
způsobí, že první výskyt textové shody bude odpovídat celému řádku. - Děkujeme za zpětnou vazbu. ' jsem nevěnoval pozornost citlivosti na případy.
g
je můj zvyk, máte pravdu, není to nutné. Také jsem si myslel, že prázdná linka byla to, co OP chtěl. Nyní je vše jasné. Díky
example
(nebotest
) následovat libovolným znakem a potécom
. Příkladecho 'exampleAcom' | sed '/example.com/d'