Bir eşleşmeyi izleyen herhangi bir satırın hemen kaldırılması gerekiyorsa, sed
programı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, sed
bir 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 sed
bir maç için önceki hattını kontrol eder match
ve eğer onun !
iki ifadeler bulunmayan {
işlevi }
çalıştırılır. sed
olacak g
ve 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 match
bu olduğu p
rinted.
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
match
match
İsteğe bağlı rasgele sayıda satır düşebilecek bir sürüm match
istiyorsanı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