Andreas Neumann <
nn...@postheo.de>:
> Wie müsste das aussehen, wenn ich z.B. feststellen will ob die
> Datei genau 12 beliebige Ziffern enthält?
Wenn die Ziffern nur die ASCII‐Ziffern sind (manche Locales
können auch noch andere Ziffern haben), sollte das folgende
funktionieren:
{
# Wirf alles weg, was keine Ziffer ist; die Ziffern
# kopiere in die Standardausgabe:
LC_ALL=C tr -d -C -- '[:digit:]' < die_Datei &&
# Gib zum Schluss ein Zeilenende aus, damit man eine
# vollstaendige Zeile erhaelt:
echo
# Jetzt ist genau eine Zeile uebrig, deren Inhalt alle
# 0 oder mehr Ziffern, als eine Zahl aneinandergereiht,
# ist.
} |
LC_ALL=C grep -E -x -q -- '[[:digit:]]{12}'
Wenn die Datei nur dem augenblicklichen Locale entsprechende
Byte‐Folgen, also keine Byte‐Folgen, die keine gültigen Zeichen
sind, enthält, dann sollte eigentlich
{
# Wirf alles weg, was keine Ziffer ist; die Ziffern
# kopiere in die Standardausgabe:
tr -d -C -- '[:digit:]' < die_Datei &&
# Gib zum Schluss ein Zeilenende aus, damit man eine
# vollstaendige Zeile erhaelt:
echo
# Jetzt ist genau eine Zeile uebrig, deren Inhalt alle
# 0 oder mehr Ziffern, als eine Zahl aneinandergereiht,
# ist.
} |
grep -E -x -q -- '[[:digit:]]{12}'
auch noch gegebenenfalls andere als die ASCII‐Ziffern zählen. (Der
Unterschied zum vorigen ist nur, dass die
Umgebungsvariablenbelegungen «LC_ALL=C» jeweils weggelassen sind.)
Zumindest auf meinem Debian‐Linux‐System beherrscht «tr» (siehe die
Bedienungsanleitung zur Option «-C») aber keine Multi‐Byte‐Zeichen;
deshalb wird das bei mir scheitern. Das bedeutet, dass mein «tr»
hier hinter dem POSIX‐Standard
(<
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/tr.html#top>)
zurückbleibt.
Im Gegensatz zu «tr» kommt «sed» auf meinem System mit
Multi‐Byte‐Zeichen aber zurecht. Also kann ich die Datei zunächst
mit «sed» putzen, indem ich alles entfernen lasse, was keine Ziffer
und kein Zeilenende ist. Danach enthält sie nur noch Zeilen, in
denen 0 oder mehr Ziffern stehen. Die kann ich dann getrost durch
«tr» schieben, um alle Zeilenenden zu entfernen. Dann kann ich wie
oben verfahren:
{
sed -e 's/[^[:digit:]]//g' -- die_Datei |
tr -d -- '\n' &&
echo
} |
grep -E -x -q -- '[[:digit:]]{12}'
In allen hier angeführten Beispielen – vorausgesetzt, man beachtet
ihre Einschränkungen – gilt: Der Exit‐Status ist genau dann 0,
wenn die Datei genau 12 Ziffern enthält.