Ben çalıştım sed
ben bu soruyu yayınlanmıştır sonra uzun değil cevabı; sed
Şimdiye kadar hiç kimse şu ana kadar kullanmadı:
sed '$!N;/^\(.*\)\n\1$/d;P;D'
Daha genel bir problemle biraz oynamak (üç veya dört veya beşli setlerde satırları silmek ne olacak?) Aşağıdaki genişletilebilir çözümü sağladı:
sed -e ':top' -e '$!{/\n/!{N;b top' -e '};};/^\(.*\)\n\1$/d;P;D' temp
Üçlü çizgileri kaldırmak için uzatıldı:
sed -e ':top' -e '$!{/\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1$/d;P;D' temp
Veya dörtlü satırları kaldırmak için:
sed -e ':top' -e '$!{/\n.*\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1\n\1$/d;P;D' temp
sed
diğer birçok seçeneğe göre ek bir avantaja sahiptir, bu da gerçek zamanlı olarak çalışabilme yeteneğidir, kopyalar için kontrol edilecek gerçek hat sayısından daha fazla bellek depolamasına gerek yoktur.
As cuonglm Açıklamalarda belirttiği düzgün multi-byte karakterleri içeren satırları kaldırmak için C yerel önlemek arızaları için gereklidir ayarı. Böylece yukarıdaki komutlar:
LC_ALL=C sed '$!N;/^\(.*\)\n\1$/d;P;D' temp
LC_ALL=C sed -e ':top' -e '$!{/\n/!{N;b top' -e '};};/^\(.*\)\n\1$/d;P;D' temp
LC_ALL=C sed -e ':top' -e '$!{/\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1$/d;P;D' temp
# Etc.
C
, aksi halde çok baytlı yerel ayarlarda, bu yerel ayardaki geçersiz karaktere komutun başarısız olmasına neden olacak şekilde ayarlamak isteyebilirsiniz .