Ho una stringa "rtcpOnNbActive true"
memorizzata in una variabile x
. Voglio estrarre "vero" come sottostringa e archiviarlo in una variabile. Come posso fare questo?
Ho una stringa "rtcpOnNbActive true"
memorizzata in una variabile x
. Voglio estrarre "vero" come sottostringa e archiviarlo in una variabile. Come posso fare questo?
Risposte:
Prova in questo modo:
y=$(echo $x | awk '{print $2}')
echo $y
echo $x
visualizza il valore di x
.awk '{print $2}'
stampa il secondo campo di quello precedentemente visualizzato x
.$(
... )
tieni premuto l'output e lascialo assegnare a y
.echo $x
è non visualizzare il valorex
. printf '%s\n' "$x"
sarebbe.
awk '{print $2}'
stampa il secondo campo di ciascuna riga di quella precedentemente visualizzata x
.
Supponendo che ci sia almeno uno spazio prima della sottostringa che si desidera estrarre (e che la sottostringa non contenga spazi), è possibile farlo con una semplice espansione dei parametri:
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
produzione
[true]
echo
non è portatile per qualcosa di diverso da una stringa letterale che non inizia con -
e non contiene sequenze di escape. Il suo comportamento varia anche per il built-in bash, a seconda di come è stato compilato e se XPG_ECHO
è impostato. Supponendo che la stringa non contenga sequenze di escape, questo dovrebbe andare bene, ma printf '[%s]\n' "$y"
è ancora meglio.
echo
per visualizzare il valore delle variabili, anche in esempi " usa e getta" come questo.
puoi usare awk:
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF
numero di campi nel record corrente
usando sed:
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
usando l'espressione stringa:
a="rtcpOnNbActive true"
echo ${a##* }
true
usando grep:
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
-o è solo una corrispondenza esatta, [a-z]+
corrisponderà lettera da az e $
significa alla fine
echo
non è portatile per qualcosa di diverso da una stringa letterale che non inizia con -
e non contiene sequenze di escape. Il suo comportamento varia anche per il built-in bash, a seconda di come è stato compilato e se XPG_ECHO
è impostato. Inoltre, dovresti sempre raddoppiare le espansioni delle variabili e la sostituzione dei comandi (con alcune eccezioni, dove non è necessario ma non fa neanche del male). Con una stringa come gli OP, questo dovrebbe andare bene, ma se vuoi assicurarti che printf '%s\n' "${a##* }"
sarebbe meglio.
È possibile utilizzare il read
built-in
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read
? Non è quello read
che fa la scissione - lo è $IFS
. Per qualche ragione molte persone considerano giusto dividere w / $IFS
solo quando read
è coinvolto. Puoi semplicemente fare: set -f; IFS=' '; printf %.0s%s $x
o qualunque cosa. In ogni caso, è necessario specificare $IFS
il valore qui.
read
eseguendo la divisione usando IFS
, controlla la documentazione . Il vantaggio principale dell'uso di read è che imposta le variabili (che è un requisito OP) e dato che può dividere stringhe e popolare un array, è utile per estrarre campi arbitrari da una stringa. Inoltre, sto assumendo il valore predefinito IFS
qui, ma è abbastanza facile da impostare se necessario, IFS=$' \n\t' read -r _ y <<<"$x"
farà il trucco
read
assegna, $IFS
divide. se vuoi popolare un array, usa set
- in questo caso non hai bisogno delle assurdità artificiali della stringa qui. unset IFS
ottiene il comportamento predefinito di $ IFS.
x
appena prima della sottostringa che si desidera estrarre?