Ich möchte so etwas in KSH machen:
if (( $var = (foo|bar)[0-9]*$ )); then
print "variable matched regex"
fi
Ist das überhaupt möglich?
Für die Aufzeichnung verwende ich Ksh Version M-11/16/88i
auf einem Solaris 10-Computer.
Ich möchte so etwas in KSH machen:
if (( $var = (foo|bar)[0-9]*$ )); then
print "variable matched regex"
fi
Ist das überhaupt möglich?
Für die Aufzeichnung verwende ich Ksh Version M-11/16/88i
auf einem Solaris 10-Computer.
Antworten:
Ksh hat reguläre Ausdrücke, jedoch nicht in der üblichen Syntax (nicht in der Version in Solaris 10 ).
if [[ $var = *@(foo|bar)*([0-9]) ]]; then …
Suchen Sie im Handbuch unter "Bedingte Ausdrücke" nach den Angaben in den Klammern und unter "Generierung von Dateinamen" nach der Mustersyntax.
=~
Operator verwendet).
Die Verwendung case
mit Glob-Mustern funktioniert möglicherweise für Sie. Das zusammengesetzte Muster *(pattern-list)
bedeutet "Entspricht null oder mehr Vorkommen der angegebenen Muster" und @(pattern-list)
bedeutet "Entspricht genau einem der angegebenen Muster".
matcher() {
typeset var="$1"
case "$var" in
*@(foo|bar)*([0-9])) print "$var matched" ;;
*) print "$var did not match" ;;
esac
}
for var in foo bar baz foo123 abc_foo132 abc_foo123z bar1 1bar1 1bar1a; do
matcher "$var"
done
Ausgänge:
foo matched
bar matched
baz did not match
foo123 matched
abc_foo132 matched
abc_foo123z did not match
bar1 matched
1bar1 matched
1bar1a did not match
Warum nicht egrep (1) verwenden ? Gibt Ihnen alles, was sich ein Regex-Benutzer wünschen kann:
if echo "$var" | egrep -s '(foo|bar)[0-9]*$' # -s means "silent"
then
...
Zusätzlicher Hinweis für Solaris: Mit Solaris möchten Sie möglicherweise die Manpage auf egrep überprüfen. Es gibt eine andere egrep- Version /usr/xpg4/bin/egrep
, die einige weitere Optionen unterstützt und sich in der Funktionalität unterscheidet, wenn es um erweiterte Regex-Inhalte geht.
Ich habe so etwas mit gemacht sed
. Ich weiß nicht, wie gut es ist, aber zumindest hat es funktioniert ^^
if [ -z "$(echo "$var" | sed -e 's/(foo|bar)[0-9]*$//')" ]; then
print "variable matched regex"
fi
grep
ist natürlicher , aber es gibt einen Weg, der in ksh eingebaut ist .
Ich weiß, dass ich zu spät zur Party komme, aber anstelle der Lösung von ktf:
if echo "$var" | egrep -s '(foo|bar)[0-9]*$' # -s means "silent"
then
...
Sie können auch verwenden
if grep -q '(foo|bar)[0-9]*$' <<< "$var" # -q means "quiet" ;-)
then
...
Diese Technik mit dem <<<
Bediener wird als Herestring bezeichnet . Ich sollte jedoch auch eine Warnung hinzufügen : Dies funktioniert NICHT in einer schreibgeschützten Umgebung (dh Sie erhalten hässliche Fehlermeldungen stderr
), da für den Herestring eine temporäre Datei erforderlich ist, in die irgendwo geschrieben werden soll. Soweit ich weiß, echo
funktioniert der "klassische" Weg mit und einer Pipe auch ohne Schreibgenehmigung.
[foo|bar]
"ein einzelnes Zeichen aus der Menge (a, b, f, o, r, |) übereinstimmen" bedeutet? Wenn Sie "Match 'Foo' oder 'Bar'"(foo|bar)