İlk uzun çizgi Grep
grep -Em1 "^.{$(wc -L <file.txt)}\$" file.txt
Bu komut alışılmadık bir şekilde pratik yapmadan okumak zordur çünkü kabuk ve regexp sözdizimini karıştırır.
Açıklama için önce basitleştirilmiş sözde kod kullanacağım. İle başlayan satırlar ##kabukta çalışmaz.
Bu basitleştirilmiş kod, F dosya adını kullanır ve okunabilirlik için alıntı ve regexps bölümlerini dışarıda bırakır.
Nasıl çalışır
Komut iki bölümden oluşur: a grep- ve bir wcçağrı:
## grep "^.{$( wc -L F )}$" F
wcBir süreç genişleme kullanılır, $( ... )bu yüzden önce çalıştırılır grep. En uzun çizginin uzunluğunu hesaplar. Kabuk genişleme sözdizimi, düzenli ifade deseni sözdizimi ile karıştırıcı bir şekilde karıştırılır, bu yüzden işlem genişlemesini parçalayacağım:
## wc -L F
42
## grep "^.{42}$" F
Burada işlem genişletme, döndürdüğü değerle değiştirildi ve grepkullanılan komut satırı oluşturuldu . Artık normal ifadeyi daha kolay okuyabiliriz: Tam olarak satırın başlangıcından ( ^) sonuna ( $) kadar eşleşir . Aralarındaki ifade, 42 satır tekrarlanan yeni satır dışındaki herhangi bir karakterle eşleşir. Kombine, tam olarak 42 karakterden oluşan satırlar.
Şimdi, gerçek kabuk komutlarına geri dönelim: ( ) grepseçeneği , okunabilirlikten kaçmamayı sağlar. Option ( ) ilk satır bulunduktan sonra durmasını sağlar. İçinde komuta önlemek için, onun stdin'e dosyasına yazar uzunluğu ile birlikte dosya adını yazdırmasını.-E--extended-regexp{}-m 1--max-count=1<wcwc
En uzun çizgiler hangileri?
Örnekleri iki kez gerçekleşen dosya adıyla daha okunaklı hale getirmek fiçin, dosya adı için bir değişken kullanacağım ; $fÖrnekteki her biri dosya adıyla değiştirilebilir.
f="file.txt"
Göster ilk uzun çizgi - en uzun hat sürece ilk satırı:
grep -E -m1 "^.{$(wc -L <"$f")}\$" "$f"
Tüm en uzun satırları göster - en uzun satır kadar uzun olan tüm satırlar:
grep -E "^.{$(wc -L <"$f")}\$" "$f"
En uzun çizgiyi göster - en uzun çizgi kadar uzun olan son çizgi:
tac "$f" | grep -E -m1 "^.{$(wc -L <"$f")}\$"
En uzun satırı göster - diğer tüm satırlardan daha uzun olan en uzun satırı göster
[ $(grep -E "^.{$(wc -L <"$f")}\$" "$f" | wc -l) = 1 ] && grep -E "^.{$(wc -L <"$f")}\$" "$f"
(Komut grep komutunu tekrar ettiği için, son komut diğerlerinden daha fazla verimsizdir. Açıkçası, çıktısının wcve yazılan satırların grepdeğişkenlere kaydedileceği şekilde ayrıştırılmalıdır. En
uzun satırların gerçekte tüm satırların olabileceğini unutmayın . Bir değişkeni kaydetmek için, sadece ilk iki satırın tutulması gerekir.)