Ich bin neu bei UNIX, habe es erst heute bei der Arbeit gestartet, habe aber Erfahrung mit Java und habe folgenden Code:
%Vor%Das funktioniert gut, aber was ich jetzt tun muss, ist zu überprüfen, wenn das Wort gelesen wird, dass es nichts außer Buchstaben enthält und wenn es numerische Zeichen im Ausdruck "Ungültige Eingabe!" Nachricht und bitten Sie sie, es erneut einzugeben. Ich nahm an, dass reguläre Ausdrücke mit einer if-Anweisung der einfache Weg dazu wären, aber ich kann nicht verstehen, wie man sie in UNIX verwendet, da ich mit der Java-Anwendung von ihnen vertraut bin. Jede Hilfe mit diesem würde sehr geschätzt werden, da ich keine Hilfe bei der Suche finden konnte, da alle Lösungen mit regulären Ausdrücken in Linux, die ich gefunden habe, nur behandelt wurden, wenn es entweder nur numerisch war oder nicht.
Der Operator mit doppelter Klammer ist eine erweiterte Version des Befehls test
, der Regexes über den Operator =~
unterstützt:
Dies ist eine Bash-spezifische Funktion. Bash ist eine neuere Shell, die nicht für alle Varianten von UNIX verfügbar ist - obwohl ich mit "neueren" meine ich "erst kürzlich in der Post-Vakuum-Röhren-Ära entwickelt" und mit "nicht alle Varianten von UNIX" meine Relikte wie alte Versionen von Solaris und HP-UX.
Meiner Meinung nach ist dies die einfachste Option, und Bash ist heutzutage sehr portabel, aber wenn es wichtig ist, auf alte UNIX-Systeme zu portieren, dann müssen Sie die sh-kompatiblen Antworten der anderen Poster verwenden. sh ist die gebräuchlichste und am weitesten verbreitete Shell, aber der Preis, den Sie für die Portabilität bezahlen, ist der Verlust von Dingen wie =~
.
Wenn Sie versuchen, portablen Shell-Code zu schreiben, sind Ihre Optionen für die String-Manipulation begrenzt. Sie können Shell-Globbing-Muster (die weniger aussagekräftig als Regexps sind) im Konstrukt case
verwenden:
BEARBEITEN : Die Einstellung LC_COLLATE
ist erforderlich, da Zeichenbereiche wie C
in den meisten nicht A-Z
Gebietsschemas nicht die "offensichtliche" Bedeutung haben. Ich nehme an, Sie wollen nur ASCII-Buchstaben; Wenn Sie auch Buchstaben mit diakritischen Zeichen möchten, ändern Sie nicht LC_COLLATE
und ersetzen Sie A-Za-z
durch [:alpha:]
(das gesamte Muster wird also *[![:alpha:]]*
).
Für vollständige Regexps, siehe den Befehl expr
. BEARBEITEN : Beachten Sie, dass expr
, wie einige andere grundlegende Shell-Werkzeuge, Tücken mit einigen speziellen Zeichenfolgen hat; Die z
-Zeichen unten verhindern, dass $word
als reservierte Wörter von expr
interpretiert wird.
Wenn Sie nur die letzten genug Versionen von bash anvisieren, gibt es andere Optionen, wie zum Beispiel den =~
Operator von [[ ... ]]
bedingten Befehlen.
Beachten Sie, dass Ihre letzte Zeile einen Fehler enthält, der erste Befehl sollte
sein %Vor% Die Anführungszeichen sind, weil etwas counterintuitiv, "$foo"
"der Wert der Variablen foo
" bedeutet, während plain $foo
bedeutet "nimm den Wert von foo
, teile ihn in separate Wörter, wo er enthalten ist Whitespace, und behandeln Sie jedes Wort als globbing Muster und versuchen Sie es zu erweitern ". (In der Tat, wenn Sie bereits überprüft haben, dass $word
nur Buchstaben enthält, ist es nicht schädlich, die Zitate zu belassen, aber es dauert länger, an diese Sonderfälle zu denken, als die Anführungszeichen einfach jedes Mal zu setzen.)
Ein portabler (bash & gt; = 3) Weg, dies zu tun ist, alle Zahlen zu entfernen und auf Länge zu testen:
%Vor%Aus Java kommend ist es wichtig zu beachten, dass bash kein wirkliches Konzept von Objekten oder Datentypen hat. Alles ist eine Zeichenfolge und komplexe Datenstrukturen sind bestenfalls schmerzhaft.
Für weitere Informationen über das, was ich getan habe, und andere verwandte Funktionen, google nach Bash-String-Manipulation.
Alle Antworten scheinen auf der Tatsache zu beruhen, dass die einzigen ungültigen Zeichen Zahlen sind. Die anfänglichen Fragen besagt, dass sie überprüfen müssen, ob die Zeichenfolge "nichts als Buchstaben" enthält.
Ich denke, der beste Weg, es zu tun ist
%Vor%Wenn Sie auf dieser Seite nach einer Möglichkeit suchen, nichtnumerische Zeichen in Ihrer Zeichenfolge zu finden (wie ich es getan habe!), ersetzen Sie [[: alpha:]] durch [[: digit:]].
Tags und Links string regex bash if-statement unix