Können in einer Datei Zeilen mit mehr als 79 Zeichen gefunden werden?
quelle
Können in einer Datei Zeilen mit mehr als 79 Zeichen gefunden werden?
In der Reihenfolge abnehmender Geschwindigkeit (auf einem GNU-System in einem UTF-8-Gebietsschema und auf ASCII-Eingabe) nach meinen Tests:
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
Mit Ausnahme von perl
¹ one (oder von awk
/ grep
/ -Implementierungen sed
(like mawk
oder busybox), die keine Mehrbyte-Zeichen unterstützen), wird die Länge in Form der Anzahl der Zeichen (gemäß der LC_CTYPE
Einstellung des Gebietsschemas) anstelle von Bytes gezählt .
Wenn die Eingabe Bytes enthält, die nicht Teil gültiger Zeichen sind (was manchmal der Fall ist, wenn der Zeichensatz des Gebietsschemas UTF-8 ist und die Eingabe in einer anderen Codierung erfolgt), sind diese Bytes abhängig von der Lösung und der Toolimplementierung zählt entweder als 1 Zeichen oder als 0 oder stimmt nicht überein .
.
Beispielsweise würde eine Zeile, die aus 30 a
sa 0x80 Byte, 30 b
s, einem 0x81 Byte und 30 UTF-8 é
s (codiert als 0xc3 0xa9) in einem UTF-8-Gebietsschema besteht, nicht .\{80\}
mit GNU grep
/ sed
(als dieses eigenständige 0x80 Byte) übereinstimmen passt nicht .
), hätte eine Länge von 30 + 1 + 30 + 1 + 2 * 30 = 122 mit perl
oder mawk
3 * 30 = 90 mit gawk
.
Wenn Sie in Bytes zählen möchten, setzen Sie das Gebietsschema auf C
mit LC_ALL=C grep/awk/sed...
.
Das hätte alle 4 Lösungen in Betracht gezogen, dass die obige Zeile 122 Zeichen enthält. Mit Ausnahme von perl
In- und GNU-Werkzeugen haben Sie immer noch potenzielle Probleme mit Zeilen, die NUL-Zeichen (0x0-Byte) enthalten.
¹ Das perl
Verhalten kann jedoch durch die PERL_UNICODE
Umgebungsvariable beeinflusst werden
awk
kann näher kommen, wenn du fällst($0)
, was sowieso implizit ist;).^
, ist dies etwas schneller: zgrep '^.\{80\}' file
.grep '^.\{1000\}' file
kehrt zurückgrep: invalid repetition count(s)
, solangeawk 'length>1000' file
erfolgreich.)Shell-Ansatz:
Python-Ansatz:
Oder als kurzes Skript zur besseren Lesbarkeit:
Wenn wir Newline - Zeichen ausschließen wollte
\n
von Berechnungen, können wir machenif len(line) > 79
werdenif len(line.strip()) > 79
Anmerkung: Dies ist die Python 2.7-Syntax. Verwenden Sie
print()
für Python 3quelle