2010-06-09 18 views
55

En Bash, quiero obtener la enésima palabra de una cadena.Nth palabra en una cadena

Por ejemplo:

STRING="one two three four" 
N=3 

Resultado:

"three" 

Lo Bash comando/script podría hacer esto?

Respuesta

68
echo $STRING | cut -d " " -f $N 
42

Una alternativa

N=3 
STRING="one two three four" 

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

Usar bash arrays para esto es la "mejor" solución, odio usar awk o sed, ya que no los veo instalados en todas las configuraciones, especialmente en la configuración de msys. – Sundar

+1

Aunque el eco "no es necesario", lo encontré útil para entender cómo usar los elementos arr. Gracias –

+0

Si ha configurado 'IFS' (el separador de campo interno) en ':' o algo en lugar de espacio en blanco, cámbielo antes de intentar esto. – Noumenon

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

En tu ejemplo, ¿STRING es realmente una cadena? Parece una matriz. –

+0

@NicolasRaoul Sí, en realidad tienes razón. Pero he escrito para ser una alternativa a. – mnrl

21

Usando awk

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

prueba

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

+1 Esto funciona con un delimitador de espacio múltiple. – tidwall

1

Sin expen tenedores sive, sin tubos, sin bashisms:

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

Pero ten cuidado con globbing.

Cuestiones relacionadas