¿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.