Ich habe eine Zeichenfolge "rtcpOnNbActive true"
in einer Variablen gespeichert x
. Ich möchte "true" als Teilzeichenfolge extrahieren und in einer Variablen speichern. Wie kann ich das machen?
Ich habe eine Zeichenfolge "rtcpOnNbActive true"
in einer Variablen gespeichert x
. Ich möchte "true" als Teilzeichenfolge extrahieren und in einer Variablen speichern. Wie kann ich das machen?
Antworten:
Versuchen Sie Folgendes:
y=$(echo $x | awk '{print $2}')
echo $y
echo $x
Zeigen Sie den Wert von an x
.awk '{print $2}'
druckt das zweite Feld des zuvor angezeigten x
.$(
... )
halten Sie den Ausgang und lassen Sie ihn zuweisen y
.echo $x
zeigt nicht den Wert von anx
. printf '%s\n' "$x"
wäre.
awk '{print $2}'
druckt das zweite Feld jeder Zeile der zuvor angezeigten x
.
Angenommen, vor dem zu extrahierenden Teilstring befindet sich mindestens ein Leerzeichen (und der Teilstring enthält keine Leerzeichen), können Sie dies mit einer einfachen Parametererweiterung tun:
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
Ausgabe
[true]
echo
ist für nichts anderes als eine Literalzeichenfolge portierbar, die nicht mit beginnt -
und keine Escape-Sequenzen enthält. Das Verhalten variiert sogar für das eingebaute Bash, je nachdem, wie es kompiliert wurde und ob XPG_ECHO
es eingestellt ist. Angenommen, die Zeichenfolge enthält keine Escape-Sequenzen, sollte dies in Ordnung sein, ist aber printf '[%s]\n' "$y"
immer noch besser.
echo
, den Wert von Variablen anzuzeigen, selbst in solchen "Wegwerf" -Beispielen.
Sie können awk verwenden:
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF
Anzahl der Felder im aktuellen Datensatz
mit sed:
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
Verwenden des Zeichenfolgenausdrucks:
a="rtcpOnNbActive true"
echo ${a##* }
true
mit grep:
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
-o gibt nur exakte Übereinstimmung, [a-z]+
stimmt mit Buchstaben von az überein und $
bedeutet am Ende
echo
ist für nichts anderes als eine Literalzeichenfolge portierbar, die nicht mit beginnt -
und keine Escape-Sequenzen enthält. Das Verhalten variiert sogar für das eingebaute Bash, je nachdem, wie es kompiliert wurde und ob XPG_ECHO
es eingestellt ist. Außerdem sollten Sie Variablenerweiterungen und Befehlssubstitutionen immer in doppelte Anführungszeichen setzen (mit bestimmten Ausnahmen, bei denen dies nicht erforderlich ist, aber auch keinen Schaden anrichtet). Mit einer Zeichenfolge wie den OPs sollte dies in Ordnung sein, aber wenn Sie sicherstellen printf '%s\n' "${a##* }"
möchten , wäre dies besser.
Sie könnten das read
eingebaute verwenden
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read
? Es ist nicht so, read
dass die Trennung erfolgt - es ist so $IFS
. Aus irgendeinem Grund halten es viele Leute für in Ordnung, sich $IFS
nur dann zu trennen, wenn read
es darum geht. Sie können einfach tun: set -f; IFS=' '; printf %.0s%s $x
oder was auch immer. In jedem Fall müssen Sie $IFS
hier den Wert angeben .
read
macht die Aufteilung mit IFS
, überprüfen Sie die Dokumentation . Der Hauptvorteil bei der Verwendung von read besteht darin, dass Variablen festgelegt werden (was eine OP-Anforderung ist). Da es Zeichenfolgen aufteilen und ein Array füllen kann, eignet es sich zum Extrahieren beliebiger Felder aus einer Zeichenfolge. Außerdem gehe ich IFS
hier von einer Standardeinstellung aus, aber es ist einfach genug, diese bei Bedarf IFS=$' \n\t' read -r _ y <<<"$x"
read
weist zu, $IFS
teilt. Wenn Sie ein Array set
füllen möchten, verwenden Sie - in diesem Fall benötigen Sie keinen künstlichen Unsinn. unset IFS
Ruft das Standardverhalten von $ IFS ab.
x
kurz vor dem Teilstring geben, den Sie extrahieren möchten?