poista rivit, jotka sisältävät tietyn tekstin tiedostossa

Minulla on tiedosto, jossa on luettelo sähköposteista ja jokaisella rivillä on sähköposti. Haluan poistaa rivit, jotka sisältävät merkkijonon example.com tai test.com.

Yritin tätä:

sed -i "s/example\.com//ig" file.txt 

Mutta se poistaa vain merkkijonon example.com. Kuinka voin poistaa koko rivin?

Vastaa

GNU sedillä:

sed "/example\.com/d;/test\.com/d" -i file.txt 

poistaa rivit sarakkeella example.com ja test.com.

Lähde: man sed:

d Delete pattern space. Start next cycle. 

Kommentit

  • Tämä poistaa myös rivin, joka sisältää example (tai test) seuraa mitä tahansa merkkiä ja sitten com. Esimerkki echo 'exampleAcom' | sed '/example.com/d'
  • Gah, hölmö minua hermostuneesti, ettet pääse pisteestä. Kiitos, että huomasit!

Vastaa

POSIXly, voit käyttää grep:

grep -Eiv "(example|test)\.com" <in >out 

Kommentit

  • Ole varovainen, ettet käytä samaa tiedostoa syötteessä ja tulostuksessa , tai se katkaistaan, ennen kuin grep voi lukea sen.

Vastaa

Regexi vastaa vain example.com ja sed korvaa vain example.com s tyhjillä merkkijono. Regexin tulee vastata mitä tahansa riviä, joka sisältää example.com tai test.com.

sed -i "s@.*\(test\|example\)\.com.*@@i" file.txt 

Kommentit

  • vastaus ei poista vastaavia rivejä; se vain tekee niistä tyhjät. – Se ei myöskään käsittele kirjainkoon erottelua (OP ' -esimerkin mukaan). -. g on turha / merkityksetön, koska sed ‍ ' n regex on ahne ja siksi etupuolella ja perässä oleva .* aiheuttaa tekstihaun ensimmäisen esiintymisen vastaavan koko riviä. ‍
  • Kiitos palautteesta. En ole ' kiinnittänyt huomiota tapausherkkyyteen. g on tapani, olet oikeassa, se ei ole välttämätöntä. Luulin myös, että tyhjennysviiva oli mitä OP halusi. Nyt kaikki on selvää. Kiitos

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *