Sed'de N'den son satıra kadar olanları nasıl yazdırabilirim?


9
  • Tamamlayıcı / "zıt" yapmak istiyorum

    sed 13q;d <file.txt
    

    Daha genel olarak, bu tür bir tamamlayıcı / ters / tersi yapmak mümkün müdür sed? Yoksa sadece normal ifadeler için mi?

  • Üçüncü ve son satır dışındaki tümünü nasıl yazdırabilirim? Bu iki tane gerektirir tacve ileriye doğru sayılır sedmı? Yoksa sedkendini arkadan saymanın bir yolu var mı?

Yanıtlar:


12

Bölüm 1

d13. hattı seçmeniz yeterlidir :

sed '13d' <file.txt

Yukarıdakilerin tamamlayıcılığını yapmanın genel bir yolu:

sed '13!d' <file.txt

Bölüm 2

Çünkü yapılabilir:

sed -n ':a;${P;q};N;4,$D;ba' <file.txt

Bunun 4, ihtiyaç duyduğunuz sayıdan daha fazla olduğunu unutmayın . Son 10 satırını isteseydiniz, bu olurdu 11.

Şununla test seq:

$ seq 100 | sed -n ':a;${P;q};N;4,$D;ba'
98
$ 

Açıklama denendi

:a        # define label a
${        # match the last line
    P     # print the first line of the pattern space
    q     # quit
}
N         # match all lines: append the next line to the pattern
4,${      # match the range of lines 4 to the end of the file
    D     # delete the first line of the pattern space
}
ba        # match all lines: jump back to label a 

Glenn Jackman'ın değerli eklentisi:

"Sadece N'inci sıra" idi. İşte "hepsi A N. Satır":

sed -n ':a;${s/^[^\n]*\n//;p;q};N;4,${P;D};ba'

GNU sed ile çalışır, \nsıra diğer seds ile çalışmayabilir.


Ben BSD sed (OSX) ile denedim ve yukarıdaki formda oldukça işe yaramadı bulundu. Sorunlar şu şekilde görünüyor:

  1. ; satırları ayırmak için kullanılan genellikle işe yarıyor gibi görünüyor, ancak bir etiketten sonra çalışmıyor
  2. ;Tek satırlı {}komut grubundaki son komuttan sonra BSD sed gerektiriyor gibi görünürken GNU sed
  3. \ngenellikle normal ifade içinde kullanılabilir, ancak görünüşe göre bir []parantez ifadesi içinde kullanılamaz. Dolayısıyla, yeni satırları hariç tutmak için [[:alnum:][:punct:][:graph:][:blank:]]bunun yerine başka bir şey kullanabiliriz , ancak bu diğer karakterleri (özellikle diğer kontrol karakterlerini) hariç tutabilir.

Bu daha platformdan bağımsız bir versiyona yönelik bir girişimdir:

sed -n ':a
${s/^[[:alnum:][:punct:][:graph:][:blank:]]*\n//p;q;};N;4,${P;D;};ba'

Bu OSX ve Ubuntu altında çalışıyor gibi görünüyor.


@jimmij SE ağındaki ilgili soruların yanıtları, bir head/ tailçözümün bir sedçözümden çok daha yavaş olduğunu göstermektedir . Yine de teşekkürler.
izomorfizmalar

3
@isomorphismes hiçbir program tüm dosyadan geçmedikçe dosyadaki satır sayısını bilemez. Bunun hiçbir yolu yok. Alttan saymanın tek yolu, dosyayı tersine çevirmek ve üstten saymak veya iki kez ayrıştırmaktır. Bu yüzden kafa / kuyruk olabildiğince hızlı olacak.
terdon

@isomorphismes ... çünkü onlar ( head/ tail) yaptıklarını yapmak için optimize edilmişlerdir.
peterph

@isomorphismes - ihtiyacınız olan tüm parçalarla düzenlendi
Digital Trauma

Güzel! Bir şekilde daha karmaşık olmasını beklediğim için cevabımı değiştirmek zorunda kaldım. :)
peterph
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.