Apakah mungkin menemukan baris dalam file yang melebihi 79 karakter?
sumber
Apakah mungkin menemukan baris dalam file yang melebihi 79 karakter?
Untuk mengurangi kecepatan (pada sistem GNU di lokal UTF-8 dan pada input ASCII) menurut pengujian saya:
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
Kecuali untuk perl
¹ satu (atau untuk awk
/ grep
/ sed
implementasi (suka mawk
atau kotak sibuk) yang tidak mendukung karakter multi-byte), yang menghitung panjang dalam hal jumlah karakter (sesuai dengan LC_CTYPE
pengaturan lokal) bukan byte .
Jika ada byte dalam input yang tidak membentuk bagian dari karakter yang valid (yang kadang-kadang terjadi ketika set karakter lokal adalah UTF-8 dan input dalam pengkodean yang berbeda), maka tergantung pada solusi dan implementasi alat, byte tersebut akan dihitung sebagai 1 karakter, atau 0 atau tidak cocok .
.
Misalnya, sebuah garis yang terdiri dari 30 a
sa 0x80 byte, 30 b
s, 0x81 byte dan 30 UTF-8 é
(disandikan sebagai 0xc3 0xa9), di lokal UTF-8 tidak akan cocok .\{80\}
dengan GNU grep
/ sed
(seperti yang berdiri sendiri 0x80 byte tidak cocok .
), akan memiliki panjang 30 + 1 + 30 + 1 + 2 * 30 = 122 dengan perl
atau mawk
, 3 * 30 = 90 dengan gawk
.
Jika Anda ingin menghitung dalam bentuk byte, perbaiki lokal C
dengan LC_ALL=C grep/awk/sed...
.
Itu akan memiliki semua 4 solusi mempertimbangkan bahwa baris di atas berisi 122 karakter. Kecuali dalam perl
dan di alat GNU, Anda masih akan memiliki masalah potensial untuk baris yang berisi karakter NUL (0x0 byte).
¹ perl
perilaku dapat dipengaruhi oleh PERL_UNICODE
variabel lingkungan
awk
dapat datang lebih dekat jika Anda drop($0)
, yang tersirat;).^
, itu sedikit lebih cepat: misalnyagrep '^.\{80\}' file
.grep '^.\{1000\}' file
kembaligrep: invalid repetition count(s)
, ketikaawk 'length>1000' file
berhasil.)Pendekatan shell:
Pendekatan python:
Atau sebagai skrip pendek untuk dibaca:
Jika kita ingin mengecualikan karakter baris baru
\n
dari perhitungan, kita dapat membuatif len(line) > 79
menjadiif len(line.strip()) > 79
Catatan: ini adalah sintaks Python 2.7. Gunakan
print()
untuk Python 3sumber