İ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
wc
Bir 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 grep
kullanı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: ( ) grep
seç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
<
wc
wc
En uzun çizgiler hangileri?
Örnekleri iki kez gerçekleşen dosya adıyla daha okunaklı hale getirmek f
iç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 wc
ve yazılan satırların grep
değ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.)