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
greppř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 '). -.
gje 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.
gje 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'