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 $xvisualizza 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]
echonon è 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.
echoper 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
echonon è 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 readbuilt-in
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read? Non è quello readche 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 $xo qualunque cosa. In ogni caso, è necessario specificare $IFSil valore qui.
readeseguendo 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 IFSqui, ma è abbastanza facile da impostare se necessario, IFS=$' \n\t' read -r _ y <<<"$x"farà il trucco
readassegna, $IFSdivide. se vuoi popolare un array, usa set- in questo caso non hai bisogno delle assurdità artificiali della stringa qui. unset IFSottiene il comportamento predefinito di $ IFS.
xappena prima della sottostringa che si desidera estrarre?