Як отримати першу літеру у змінній Баша?


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

26
Це не повинно бути прийнятою відповіддю з причин, на які вказані вищевказані коментарі. Реальні відповіді наведені нижче - ${word:0:1}або ${word::1}.
noamtm

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

Почекай, так і є head -c n, ого. echo "fábio" | head -c 2дає f� , отже, це ще одна проблема з цим, я думаю.
phicr


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. Якщо це не працює у вас, і вам потрібна допомога у налагодженні, скопіюйте та вставте введені вами команди та їх результати.
Адам Лісс

2
Дякую, Адаме, погано, я не можу зрозуміти, чому це раніше не працювало для мене, але зараз він працює чудово, на декількох версіях bash, які я спробував, повертаючись до GNU bash, v3.1.0. Досі не працює у zsh, але питання має позначку "баш", тож це неактуально.
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.