odstranit řádky, které obsahují konkrétní text v souboru

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

  • Tím se také smaže řádek obsahující example (nebo test) následovat libovolným znakem a poté com. Příklad echo 'exampleAcom' | sed '/example.com/d'
  • Gah, hloupě, roztržitě neuniknu tečce. Děkujeme, že jste si toho všimli!

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že sed ‍ ' 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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *