Как получить первую букву в переменной Bash?


88

У меня есть переменная Bash $word, которая иногда является словом или предложением, например:

word="tiger"

Или:

word="This is a sentence."

Как создать новую переменную Bash, равную только первой букве, найденной в переменной? Например, приведенное выше будет:

echo $firstletter
t

Или:

echo $firstletter
T

Ответы:


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

Каждый раз, когда вы говорите «первый» в описании проблемы, headэто вероятное решение.


8
Обратите внимание, что -cв заголовке POSIX нет опции: < unix.com/man-page/posix/1/head >.
gioele

9
Это действительно возвращает первую букву, но это перебор, и решение зависит от внешних утилит (голова). Это можно сделать в чистой оболочке, которая будет чище.
automatthias 07

26
Этот ответ не должен быть принятым по причинам, указанным в приведенных выше комментариях. Настоящие ответы ниже - ${word:0:1}или ${word::1}.
noamtm

Для соответствия требованиям POSIX вы могли бы сделать echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"или , printf '%c' "$X"но это все подчинено одной ст. Мульти проделки байт символов.
phicr 01

Подожди, да head -c n, упс. echo "fábio" | head -c 2дает f� , так что это еще одна проблема, я думаю.
phicr 01


73
word=something
first=${word::1}

1
Это было бы замечательно, но у меня не работает ни в bash 4.3.11, ни в zsh 5.0.5
yoniLavi

1
В GNU bash v4.3.11 firstустанавливается буква s. Вы можете увидеть это с помощью echo $s. Если это не сработает для вас и вам нужна помощь в отладке, скопируйте и вставьте набранные вами команды и их вывод.
Adam Liss

2
Спасибо, Адам, плохо, я не могу понять, почему у меня это не сработало раньше, но теперь оно отлично работает на нескольких версиях bash, которые я пробовал, возвращаясь к GNU bash, v3.1.0. По-прежнему не работает в zsh, но вопрос помечен как «bash», так что это не имеет значения.
yoniLavi

Спасибо за отслеживание и подтверждение! Рад, что это работает на тебя.
Адам Лисс,



2

Поскольку у вас есть sedтег, вот sedответ:

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

Игра за игрой для тех, кому нравится (я люблю!):

{

  • s: начать процедуру замены
    • /: Начните указывать, что нужно заменить
    • ^\(.\): захватить первого персонажа в группе 1
    • .*:, убедитесь, что остальная часть строки будет в замене
    • /: начать указывать замену
    • \1: вставить группу 1
    • /: Остальное отбрасывается;
  • q: Выйти, sedчтобы не повторять этот блок для других строк, если они есть.

}

Что ж, было весело! :)Вы можете также использовать grepи т.д. , но если вы находитесь в bashв ${x:0:1}магики еще лучшее решение имо. (Я потратил около часа, пытаясь использовать для этого расширение переменной POSIX, но не смог :( )


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.