Extrahieren des zweiten Wortes aus einer Zeichenfolgenvariablen
11
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?
echo $xzeigt nicht den Wert von anx . printf '%s\n' "$x"wäre.
Stéphane Chazelas
2
awk '{print $2}'druckt das zweite Feld jeder Zeile der zuvor angezeigten x.
Stéphane Chazelas
9
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:
echoist 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_ECHOes eingestellt ist. Angenommen, die Zeichenfolge enthält keine Escape-Sequenzen, sollte dies in Ordnung sein, ist aber printf '[%s]\n' "$y"immer noch besser.
Nyuszika7h
1
@ nyuszika7h: Guter Punkt, und nachdem ich gelesen habe, dass Stéphane Chazelas hier und in anderen aktuellen Fragen ähnliche Dinge gesagt hat, sollte ich wirklich meine Gewohnheit aufgeben echo, den Wert von Variablen anzuzeigen, selbst in solchen "Wegwerf" -Beispielen.
Veröffentlichen Sie bitte keine Inhalte anderer Antworten für Sie in derselben Frage.
αғsнιη
1
was andere antworten ????
Hackaholic
er kann es in variablen speichern, es ist keine große Sache hier
Hackaholic
echoist 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_ECHOes 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.
Nyuszika7h
3
Es ist möglich, dafür Bash-Arrays zu verwenden, z.
warum einbeziehen read? Es ist nicht so, readdass die Trennung erfolgt - es ist so $IFS. Aus irgendeinem Grund halten es viele Leute für in Ordnung, sich $IFSnur dann zu trennen, wenn reades darum geht. Sie können einfach tun: set -f; IFS=' '; printf %.0s%s $xoder was auch immer. In jedem Fall müssen Sie $IFShier den Wert angeben .
Mikesserv
@mikeserv, es readmacht 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 IFShier von einer Standardeinstellung aus, aber es ist einfach genug, diese bei Bedarf IFS=$' \n\t' read -r _ y <<<"$x"
festzulegen. Sie
Nein, ist es nicht. readweist zu, $IFSteilt. Wenn Sie ein Array setfüllen möchten, verwenden Sie - in diesem Fall benötigen Sie keinen künstlichen Unsinn. unset IFSRuft das Standardverhalten von $ IFS ab.
Mikesserv
@mikeserv, du bist von meiner Weihnachtskartenliste gestrichen.
x
kurz vor dem Teilstring geben, den Sie extrahieren möchten?Antworten:
Versuchen Sie Folgendes:
echo $x
Zeigen Sie den Wert von anx
.awk '{print $2}'
druckt das zweite Feld des zuvor angezeigtenx
.$(
...)
halten Sie den Ausgang und lassen Sie ihn zuweiseny
.quelle
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 angezeigtenx
.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:
Ausgabe
quelle
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 obXPG_ECHO
es eingestellt ist. Angenommen, die Zeichenfolge enthält keine Escape-Sequenzen, sollte dies in Ordnung sein, ist aberprintf '[%s]\n' "$y"
immer noch besser.echo
, den Wert von Variablen anzuzeigen, selbst in solchen "Wegwerf" -Beispielen.Sie können awk verwenden:
NF
Anzahl der Felder im aktuellen Datensatzmit sed:
Verwenden des Zeichenfolgenausdrucks:
mit grep:
-o gibt nur exakte Übereinstimmung,
[a-z]+
stimmt mit Buchstaben von az überein und$
bedeutet am Endequelle
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 obXPG_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 sicherstellenprintf '%s\n' "${a##* }"
möchten , wäre dies besser.Es ist möglich, dafür Bash-Arrays zu verwenden, z.
quelle
Sie könnten das
read
eingebaute verwendenquelle
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, wennread
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 mitIFS
, ü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 ichIFS
hier von einer Standardeinstellung aus, aber es ist einfach genug, diese bei BedarfIFS=$' \n\t' read -r _ y <<<"$x"
read
weist zu,$IFS
teilt. Wenn Sie ein Arrayset
füllen möchten, verwenden Sie - in diesem Fall benötigen Sie keinen künstlichen Unsinn.unset IFS
Ruft das Standardverhalten von $ IFS ab.