Um Zeilen mit mehr als 80 Spalten zu zählen, verwende ich derzeit diesen Befehl:
$ git grep -h -c -v '^.\{,80\}$' **/*.{c,h,p{l,y}} \
|awk 'BEGIN { i=0 } { i+=$1 } END { printf ("%d\n", i) }'
44984
Leider verwendet das Repo Tabulatoren zum Einrücken, sodass das grep
Muster ungenau ist. Gibt es überhaupt eine Möglichkeit, die regex
Registerkarten mit der Standardbreite von 8 Zeichen zu versehen, wie wc -L
?
Für die Zwecke dieser Frage können wir davon ausgehen, dass die Mitwirkenden diszipliniert genug waren, um konsequent einzurücken, oder dass sie git commit
anstelle von Disziplin Haken haben .
Aus Gründen der Leistung würde ich eine Lösung bevorzugen, die innerhalb git-grep(1)
oder möglicherweise in einem anderen grep
Tool funktioniert
, ohne Dateien vorzuverarbeiten .
git grep -P
(zumindest mit meiner 2.18.0-Version unter Debian hier) nicht mit Mehrbyte-Zeichen funktioniert. Beispielsweise wird davon ausgegangen, dass©
(in Quelldateien üblich) 2 Zeichen anstelle von einem Zeichen sind, wenn es in UTF-8 codiert ist. Es ist in Ordnung mit-E
. Sie können es in UTF-8-Gebietsschemasgit grep -hcP '(*UTF8)...'
-E
dann wechsle,\t
wird nicht erkannt. Ich nehme an, die schnelle Lösung besteht darin, eine mit Ansi C zitierte Zeichenfolge$'...'
anstelle einer mit einfachen Anführungszeichen zu verwenden'...'
.Verarbeiten Sie die Dateien vorab, indem Sie sie durchleiten
expand
. Dasexpand
Dienstprogramm erweitert die Registerkarten entsprechend (unter Verwendung der Standard-Tabulatoren bei jedem 8. Zeichen).quelle
GNU
wc -L
behandelt TABs nicht als 8 Zeichen, sondern TABs so, wie sie in einem Terminal mit TAB-Stopps alle 8 Spalten angezeigt werden. Die "Breite" liegt also zwischen 1 und 8 Zeichen, je nachdem, wo sie sich in der Zeile befinden .wc -L
Berücksichtigt auch die Anzeigebreite anderer Zeichen (unabhängig davon, ob sie 0, 1 oder 2 Spalten breit sind) und verarbeitet\f
und\r
"korrekt".Hier können Sie
expand
diese TABs verwenden (wobei standardmäßig auch alle 8 Spalten Tabulatoren vorausgesetzt werden, obwohl Sie sie mit Optionen ändern können), um diese TABs auf Leerzeichen zu erweitern:(Konvertieren der CRs (die beim Senden an ein Terminal den Cursor zurück zum Zeilenanfang bewegen) und der FFs (die von einigen Anzeigegeräten als Seitenumbruch verstanden werden) in LF, um das gleiche Verhalten wie zu erhalten
wc -L
, die anderen jedoch zu ignorieren was wir sowieso nicht sagen können, welchen Einfluss sie auf die Anzeigebreite haben werden).Dies gilt für TABs, jedoch nicht für Zeichen mit einfacher oder doppelter Breite. Beachten Sie, dass die GNU-Implementierung von
expand
derzeit TABs nicht richtig erweitert, wenn Mehrbyte-Zeichen vorhanden sind (geschweige denn Null- oder Doppelbreitenzeichen).Beachten Sie auch, dass
./**/*.{c,h,p{l,y}}
standardmäßig versteckte Dateien oder Dateien in versteckten Verzeichnissen übersprungen werden. Wenn die Klammererweiterung auf mehrere Globs erweitert wird, werden auch Fehler (schwerwiegend mitzsh
oderbash -O failglob
) angezeigt, wenn einer dieser Globs nicht übereinstimmt.Mit würden
zsh
Sie verwenden,./**/*.(c|h|p[ly])(D.)
welches ein Glob ist und woD
versteckte Dateien enthalten und.
auf reguläre Dateien beschränkt sind.Für eine Lösung, die die tatsächliche Breite der Zeichen berücksichtigt (vorausgesetzt, alle Textdateien sind in der Zeichencodierung des Gebietsschemas codiert), können Sie Folgendes verwenden:
Beachten Sie, dass zumindest auf GNU-Systemen
mbswidth()
Steuerzeichen mit einer Breite von-1
und 1 für betrachtet werdenexpand()
. Wir gehen davon aus, dass in den Dateien kein anderes Steuerzeichen als CR, NL, TAB, FF gefunden wird.quelle
#define symbol value
oder Deklarationen verwendet werden.Eine Lösung mit ex (aus vi ). Wenn auch langsam.
Da vi UTF-8-Daten korrekt verarbeiten kann:
Es könnte Tabulatoren zu Leerzeichen erweitern, Steuerzeichen als 1 zählen,
\r
\t
\f
\v
korrekt verarbeiten und auch die meisten gültigen UNICODE-Werte verarbeiten. Einschließlich komponierter (NKC) und zerlegter (NKD) Akzente sowie Zeichen aus Kyrillisch, Arabisch, Griechisch, Chinesisch und vielen anderen.Rufen Sie das Skript auf als:
quelle