Bir eşleşmeyi izleyen herhangi bir satırın hemen kaldırılması gerekiyorsa, sedprogramınız ardışık eşleşmeleri dikkate almalıdır . Başka bir deyişle, aynı zamanda eşleşen bir eşleşmeyi izleyen bir çizgiyi kaldırırsanız, o zaman muhtemelen onu izleyen çizgiyi de kaldırmalısınız.
Basitçe yeterli bir şekilde uygulanır - ancak biraz geriye bakmanız gerekir.
printf %s\\n 0 match 2 match match \
5 6 match match match \
10 11 12 match 14 15 |
sed -ne'x;/match/!{g;//!p;}'
0
6
11
12
15
Okunan her satır için tutma ve desen boşluklarını değiştirerek çalışır - böylece son satır her zaman akıma göre karşılaştırılabilir. Bu nedenle, sedbir satır okuduğunda, arabelleklerinin içeriğini değiştirir - ve önceki satır, düzenleme satırının içeriğidir, mevcut satır boşluğa yerleştirilir.
Yani sedbir maç için önceki hattını kontrol eder matchve eğer onun !iki ifadeler bulunmayan {işlevi }çalıştırılır. sedolacak gve model alanı üzerine yazarak tutma alanı - bu olacaktır - ve daha sonra mevcut hat tutma ve desen boşluk hem de daha sonra olduğu anlamına gelir //, en yakın zamanda derlenmiş normal ifade için bir eşleşme için kontrol - match- ve eğer bu değil matchbu olduğu printed.
Bu, satırın yalnızca yazmaması ve önceki satırın yazmaması durumunda yazdırılacağı anlamına gelir . Aynı zamanda es dizileri için gereksiz takaslardan da vazgeçmektedir .match matchmatch
İsteğe bağlı rasgele sayıda satır düşebilecek bir sürüm matchistiyorsanız, biraz daha fazla çalışmaya ihtiyaç duyacak:
printf %s\\n 1 2 3 4 match \
match match 8 \
9 10 11 12 13 \
14 match match \
17 18 19 20 21 |
sed -net -e'/match/{h;n;//h;//!H;G;s/\n/&/5;D;}' -ep
... 5'i, kaldırmak istediğiniz satır sayısıyla (eşleşen satır dahil) değiştirin ...
1
2
3
4
12
13
14
21