Bagaimana cara menghilangkan sed baris yang tidak cocok?

8

Dalam contoh berikut, sedcocokkan garis yang dimulai dengan a aatau a cdan cetak karakter pertama dari garis itu ( aatau c):

$ echo "ag
bh
ci
dj
ek
fl" | sed 's/\(a\|c\)./\1/' # Matches lines starting with 'a' or 'c'.

output:
a
bh
c
dj
ek
fl

Namun, garis-garis yang tidak cocok dengan pola juga dicetak. Bagaimana saya mengatakan seduntuk menghilangkan garis yang tidak cocok dengan pola? Saya dapat memperoleh efek yang diinginkan dengan menggabungkannya dengan grep(sebagai berikut) tetapi saya ingin tahu apakah seddapat mencapai itu "dengan sendirinya".

$ echo "ag
bh
ci
dj
ek
fl" | grep '[ac]' | sed 's/\(a\|c\)./\1/'

output:
a
c
freitas
sumber
Tidak masalah untuk apa yang benar-benar ingin Anda ketahui, tetapi pola Anda harus dimulai dengan ^ jadi itu berlabuh ke awal baris. Seperti yang dikodekan, itu akan cocok dengan a atau c di mana saja dalam baris selama itu bukan karakter terakhir.
Joe

Jawaban:

12

Gunakan no-printflag ( -n) dan cetak perintah pengganti yang berhasil secara eksplisit ( s///p):

 sed -n 's/\(a\|c\)./\1/p'
Thor
sumber