Estrarre la seconda parola da una variabile stringa


11

Ho una stringa "rtcpOnNbActive true"memorizzata in una variabile x. Voglio estrarre "vero" come sottostringa e archiviarlo in una variabile. Come posso fare questo?


Ci sarà sempre uno spazio xappena prima della sottostringa che si desidera estrarre?
PM 2Ring

Risposte:


21

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.

3
echo $xè non visualizzare il valorex . printf '%s\n' "$x"sarebbe.
Stéphane Chazelas,

2
awk '{print $2}'stampa il secondo campo di ciascuna riga di quella precedentemente visualizzata x.
Stéphane Chazelas,

9

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]

3
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.
nyuszika7h,

1
@ nyuszika7h: buon punto, e dopo aver letto Stéphane Chazelas dire cose simili qui e in altre domande recenti dovrei davvero rompere l'abitudine di usare echoper visualizzare il valore delle variabili, anche in esempi " usa e getta" come questo.
PM 2Ring

4

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


2
Non pubblicare contenuti di altre risposte per le tue nella stessa domanda, per favore.
ғғsнιη,

1
cosa rispondono gli altri ????
Hackaholic,

può salvarlo in una variabile non è un grosso problema qui
Hackaholic il

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.
nyuszika7h,

3

A tale scopo è possibile utilizzare array di bash, ad esempio:

arr="(first second third)"
echo ${arr[1]}

2

È possibile utilizzare il readbuilt-in

read -r _ y <<<"$x"
printf "%s\n" "$y"
true

perché coinvolgere 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.
Mikeserv,

@mikeserv, sta 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
Iruvar

no non lo è. 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.
Mikeserv,

@mikeserv, sei fuori dalla mia lista di cartoline di Natale.
Iruvar,

bah humbug. Natale è per ventose.
Mikeserv,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.