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
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, koskased
' 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
example
(taitest
) seuraa mitä tahansa merkkiä ja sittencom
. Esimerkkiecho 'exampleAcom' | sed '/example.com/d'