sed - cara menghapus semua garis yang tidak cocok

12

Saya punya file html. Saya ingin menghapus semua baris yang tidak dimulai <tr>.

Saya mencoba:

cat my_file | sed $'
s/^[^tr].*//
' | sed '/^$/d'

tapi itu menghapus semua baris.

Michael Durrant
sumber
3
Lebih mudah dengan grep.
jcbermu
1
s/^[^tr]...cocok dengan garis yang dimulai dengan karakter apa pun selain tatau r. Kurung kotak adalah rentang karakter dalam suatu regex.
Peter Cordes

Jawaban:

18

Coba ini dengan sed GNU:

sed -n '/^<tr>/p' file

atau

sed '/^<tr>/!d' file
Cyrus
sumber
1
Saya menemukan versi dengan !dsangat berguna karena memungkinkan Anda untuk menulis perintah sed lain dalam ekspresi, sedangkan phanya mencetak kecocokan, tetapi perintah selanjutnya memiliki input yang tidak dikunci.
jirislav
9
sed -e '/^<tr>/d'

Bagian di antaranya /adalah regex. The dperintah menghapus garis yang cocok.

Perbarui: oops, maaf saya melihat Anda berkata TIDAK. Begitu

sed -e '/^<tr>/!d'

Di mana !meniadakan arti pertandingan.

pengguna3188445
sumber
3

Jika harus sed:

sed -ni '/^<tr>/p' file

-imengedit file di tempat, -nmencegah seduntuk mencetak semua baris, ekspresi reguler berarti untuk mencocokkan semua baris yang dimulai ( ^) dengan <tr>dan baris-baris itu akan dicetak ( p).

Dengan grep:

grep -E '^<tr>' file

Dengan -Einterpretasi grep, diperpanjang ekspresi reguler.

Dengan awk:

awk '/^<tr>/' file

Atau murni bash:

while IFS= read -r l; do [[ "$l" =~ ^\<tr\> ]] && echo $l; done <file

Ini [[adalah ekspresi kondisional internal bashs. Kami membandingkan $ldengan ekspresi reguler dan jika berhasil ( &&) kami mencetak baris dengan echo.

kekacauan
sumber
Versi pure-bash Anda gagal mengutip "$l". Dan Anda meletakkannya sebagai argumen pertama pada echobaris perintah, jadi Anda akan memiliki masalah jika dimulai dengan a -option. (Gunakan printf '%s\n' "$l"). Also, shell read` harus membaca satu-byte-pada-waktu, jadi itu sangat lambat. Memproses file teks dalam bash murni biasanya bukan pilihan yang baik kecuali Anda tahu file Anda sangat kecil.
Peter Cordes
2

Jawaban termudah dan paling sederhana adalah:

grep '^<tr>' path/to/file 

Ini akan mencetak file dengan hanya baris yang dimulai dengan yang mungkin bagus jika Anda tidak ingin memodifikasi file secara langsung (seperti dengan sed).

Kemudian, jika Anda menyukai apa yang Anda lihat di output, Anda cukup mencetak ke file > file

Dalam hal ini Anda menghemat waktu untuk membuat cadangan file Anda sebelum mencoba beberapa perintah.

VaTo
sumber