Yanıtlar:
Testlerime göre hız düşürme sırasına göre (UTF-8 yerel ayarındaki bir GNU sisteminde ve ASCII girişinde):
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
Hariç perl
¹ biri (veya awk
/ grep
/ sed
gibi uygulamaları ( mawk
multi-byte karakterleri desteklemeyen veya BusyBox)) sayısı bakımından uzunluğunu sayar, karakterlerin (uygun LC_CTYPE
yerine yerel ayarının ayar) bayt .
Girdide geçerli karakterlerin bir kısmını oluşturmayan baytlar varsa (bu, bazen yerel ayarın karakter kümesi UTF-8 ve giriş farklı bir kodlamada olduğunda olur), o zaman çözüme ve araç uygulamasına bağlı olarak, bu baytlar 1 karakter olarak sayılacak veya 0 eşleşmeyecektir .
.
Örneğin, bir UTF-8 yerel ayarında 30 a
sa 0x80 bayt, 30 b
s, 0x81 bayt ve 30 UTF-8 é
s (0xc3 0xa9 olarak kodlanmış) içeren bir satır .\{80\}
GNU ile eşleşmeyecek grep
/ sed
(bu bağımsız 0x80 bayt uyuşmuyor .
), 30 + 1 + 30 + 1 + 2 * 30 = 122 uzunluğunda perl
veya mawk
3 * 30 = 90 uzunluğunda olur gawk
.
Bayt cinsinden saymak istiyorsanız, yerel ayarı ile C
ile düzeltin LC_ALL=C grep/awk/sed...
.
Bu, 4 çözümün hepsinin de yukarıdaki satırın 122 karakter içerdiğini düşünmesini sağlar. İçeride perl
ve GNU araçları dışında, NUL karakterleri içeren satırlar için (0x0 bayt) hala potansiyel sorunlarınız olacaktır.
Though perl
Davranış, PERL_UNICODE
çevre değişkeninden etkilense de
awk
düşerse ($0)
, daha yakın gelebilir ;
^
, biraz daha hızlı olur: örn grep '^.\{80\}' file
.
grep '^.\{1000\}' file
döner .)grep: invalid repetition count(s)
awk 'length>1000' file
Kabuk yaklaşımı:
while IFS= read -r line || [ -n "$line" ];
do
[ "${#line}" -gt 79 ] && printf "%s\n" "$line"
done < input.txt
Python yaklaşımı:
python -c 'import sys;f=open(sys.argv[1]);print "\n".join([ l.strip() for l in f if len(l) >79 ]);f.close()' input.txt
Veya okunabilirlik için kısa bir komut dosyası olarak:
#!/usr/bin/env python
import sys
with open(sys.argv[1]) as f:
for line in f:
if len(line) > 79:
print line.strip()
Newline karakterini \n
hesaplamalardan çıkarmak istiyorsak if len(line) > 79
,if len(line.strip()) > 79
Yan not: bu Python 2.7 sözdizimidir. print()
Python 3 için kullanın