2012-04-18 30 views
51

que tienen una variable Bash, $word, que a veces es una palabra o frase, por ejemplo:¿Cómo obtener la primera letra en una variable de Bash?

word="tiger" 

O:

word="This is a sentence." 

¿Cómo puedo hacer una nueva variable Bash que es igual a sólo el primera letra encontrada en la variable? Por ejemplo, lo anterior sería:

echo $firstletter 
t 

O:

echo $firstletter 
T 

Respuesta

22
initial="$(echo $word | head -c 1)" 

Cada vez que usted dice "primero" en la descripción del problema, head es una solución probable.

+6

Tenga en cuenta que no hay ninguna opción '-c' en la cabeza POSIX: . – gioele

+3

Esto devuelve la primera letra, pero es una exageración, y la solución depende de utilidades externas (cabeza). Esto se puede hacer en puro shell, que es más limpio. – automatthias

+10

Esta no debería ser la respuesta aceptada, por las razones señaladas por los comentarios anteriores. Las respuestas reales están debajo - '$ {palabra: 0: 1}' o '$ {palabra :: 1}'. – noamtm

170
word="tiger" 
firstletter=${word:0:1} 
+3

Exactamente lo que estaba buscando. One-liner, sin desove de subcapas. ¡Toma mi voto! –

58
word=something 
first=${word::1} 
+1

Esto sería maravilloso, pero no funciona para mí, ni en bash 4.3.11 ni en zsh 5.0.5 – yoniLavi

+1

Con GNU bash v4.3.11, 'first' está configurado con la letra' s'. Puedes verlo con 'echo $ s'. Si eso no funciona para usted, y desea ayuda para la depuración, copie y pegue los comandos que escribió y su resultado. –

+1

Gracias Adam, mi mal, no puedo entender por qué no funcionó para mí antes, pero funciona perfectamente bien ahora en varias versiones de bash que probé, volviendo a GNU bash, v3.1.0. Aún no funciona en zsh, pero la pregunta está etiquetada como "bash", por lo que es irrelevante. – yoniLavi

1

Puesto que usted tiene una etiqueta sed que aquí hay una respuesta sed:

echo "$word" | sed -e "{ s/^\(.\).*/\1/ ; q }" 

juego por el juego para aquellos que disfrutan de los (yo!):

{

  • s: iniciar un cambio de rutina
    • /: Inicio especificar lo que debe ser sustituido
    • ^\(.\): capturar el primer carácter en el Grupo 1
    • .*: asegúrese de que el resto de la línea será en la sustitución
    • /: comenzar especificando la sustitución
    • \1: inserte Grupo 1
    • /: El resto se desecha ;
  • q: Quit sed para que no se repita este bloque para otras líneas si los hay.

}

Bueno, eso fue divertido! :) También puede usar grep y etc., pero si está en bash, la magia de ${x:0:1} sigue siendo la mejor solución.(Pasé como una hora tratando de usar POSIX expansión de variables a hacer eso, pero no podía :()

+0

Publiqué una solución POSIX aquí: https://stackoverflow.com/a/44988512/4694621 –

0

usando bash 4:

x="test" 
read -N 1 var <<< "${x}" 
echo "${var}" 
Cuestiones relacionadas