¿Cómo obtener la primera letra en una variable Bash?


88

Tengo una variable Bash $word, que a veces es una palabra u oración, por ejemplo:

word="tiger"

O:

word="This is a sentence."

¿Cómo puedo hacer una nueva variable Bash que sea igual a solo la primera letra que se encuentra en la variable? Por ejemplo, lo anterior sería:

echo $firstletter
t

O:

echo $firstletter
T

Respuestas:


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

Cada vez que dice "primero" en la descripción de su problema, heades una solución probable.


8
Tenga en cuenta que no hay ninguna -copción en el encabezado POSIX: < unix.com/man-page/posix/1/head >.
gioele

9
Esto devuelve la primera letra, pero es una exageración y la solución depende de las utilidades externas (jefe). Esto se puede hacer en cáscara pura, que es más limpia.
autómatas

26
Esta no debe ser la respuesta aceptada, por las razones señaladas en los comentarios anteriores. Las respuestas reales están debajo - ${word:0:1}o ${word::1}.
noamtm

Para compatibilidad POSIX que podría hacer echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"o printf '%c' "$X"pero estos son todos sujetos a una sola v. Chanchullos varios caracteres de bytes.
phicr

Espera, también lo es head -c n, ¡Ups! echo "fábio" | head -c 2da f� , entonces ese es otro problema con esto, supongo.
phicr


73
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, firstse ajusta a la letra s. Puedes verlo con echo $s. Si eso no funciona para usted y desea ayuda con la depuración, copie y pegue los comandos que escribió y su salida.
Adam Liss

2
Gracias Adam, mi culpa, no puedo entender por qué no me funcionó antes, pero ahora funciona perfectamente bien en varias versiones de bash que probé, volviendo a GNU bash, v3.1.0. Todavía no funciona en zsh, pero la pregunta está etiquetada como "bash", así que eso es irrelevante.
yoniLavi

¡Gracias por hacer un seguimiento y confirmar! Me alegro de que esté funcionando para ti.
Adam Liss



2

Dado que tiene una sedetiqueta, aquí hay una sedrespuesta:

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

Juego a juego para los que disfrutan (¡yo sí!):

{

  • s: inicia una rutina de sustitución
    • /: Empiece a especificar qué se va a sustituir
    • ^\(.\): captura el primer personaje del Grupo 1
    • .*:, asegúrese de que el resto de la línea estará en la sustitución
    • /: comience a especificar el reemplazo
    • \1: insertar Grupo 1
    • /: El resto se descarta;
  • q: Salga sedpara que no se repita este bloque para otras líneas si las hay.

}

¡Bueno eso fue divertido! :)También puede usar grepy etc., pero si está en bashla ${x:0:1}magia, es la mejor solución en mi opinión. (Pasé como una hora tratando de usar la expansión de variables POSIX para hacer eso, pero no pude :( )


1

Usando bash 4:

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.