Ennesima parola in una variabile stringa


87

In Bash, voglio ottenere l'ennesima parola di una stringa trattenuta da una variabile.

Per esempio:

STRING="one two three four"
N=3

Risultato:

"three"

Quale comando / script Bash potrebbe fare questo?

Risposte:


99
echo $STRING | cut -d " " -f $N

3
cut fallirà quando si richiede un campo che non esiste. Invece di restituire "" restituirà la stringa stessa. Esempio: echo "aaaa" | Il risultato di cut -f2 è "aaaa", non il risultato di lunghezza zero vuoto.
ajaaskel

@ajaaskel Sembra che ciò accada quando il delimitatore non viene trovato nell'input. E quel comportamento al giorno d'oggi può essere modificato utilizzando l'opzione --only-delimited.
Samuli Pahaoja

64

Un'alternativa

N=3
STRING="one two three four"

arr=($STRING)
echo ${arr[N-1]}

3
Usare gli array bash per questa è "la migliore" soluzione, odio usare awk o sed, poiché non li vedo installati su tutti i setup, specialmente il setup di msys.
domenica

1
Anche se l'eco "non è necessario", l'ho trovato utile per capire come utilizzare gli elementi arr. Grazie
Chen Li Yong

1
Se hai impostato IFS(il separatore di campo interno) su ":" o qualcosa al posto dello spazio bianco, modificalo prima di provare questo.
Noumenon

1
Questa dovrebbe essere la risposta giusta. Usare gli array per questo scopo è semplice e intelligente.
ajaaskel

32

Utilizzando awk

echo $STRING | awk -v N=$N '{print $N}'

Test

% N=3
% STRING="one two three four"
% echo $STRING | awk -v N=$N '{print $N}'
three

9

Un file contenente alcune dichiarazioni:

cat test.txt

Risultato:

This is the 1st Statement
This is the 2nd Statement
This is the 3rd Statement
This is the 4th Statement
This is the 5th Statement

Quindi, per stampare la quarta parola di questo tipo di istruzione:

cat test.txt |awk '{print $4}'

Produzione :

1st
2nd
3rd
4th
5th

2
L'OP dice che la stringa è in una variabile, non in un file.
codeforester

3

Niente forchette costose, niente pipe, niente bashismi:

$ set -- $STRING
$ eval echo \${$N}
three

Ma attenzione ai globbing.


2
STRING=(one two three four)
echo "${STRING[n]}"

2
Nel tuo esempio, STRING è davvero una stringa? Sembra un array.
Nicolas Raoul

@NicolasRaoul Sì, effettivamente hai ragione. Ma ho scritto per essere un'alternativa a.
mnrl
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.