Несмотря на то, что он является более сложным, чем ответ с наилучшими оценками, на самом деле он делает именно это: «первый символ в переменной в верхнем регистре». Лучший результат не имеет таких результатов. Похоже, за простые ответы проголосуют охотнее, чем за правильные?
Кшиштоф Яблонский
15
@ KrzysztofJabłoński: На самом деле, «лучший результат», приведенный ниже, даст те же результаты, что и этот ответ в Bash 4. У этого ответа есть издержки вызова subshell (другой оболочки), издержки вызова утилиты 'tr' (другой процесс). , а не Bash), накладные расходы на использование here-doc / string (создание временного файла), и он использует две замены по сравнению с ответом с лучшим результатом. Если вам абсолютно необходимо написать устаревший код, рассмотрите возможность использования функции вместо подоболочки.
Стив
2
В этом ответе предполагается, что ввод вводится только в нижнем регистре. Этот вариант не имеет допущений: $ (tr '[: lower:]' '[: upper:]' <<< $ {foo: 0: 1}) $ (tr '[: upper:]' '[: lower: ] '<<< $ {foo: 1})
Итай Гански
5
@ItaiHanski В ОП не указано, что должно происходить с оставшимися символами, только первый. Предположительно они хотели изменить notQuiteCamelв NotQuiteCamel. Ваш вариант имеет побочный эффект или заставляет оставшиеся в нижнем регистре за счет удвоения количества вложенных оболочек и tr процессов.
Джесси Чисхолм,
3
@DanieleOrlando, правда, но этот вопрос не имеет никаких тегов, кроме bash.
@CMCDragonkai: использовать строчные буквы первой буквы "${foo,}". Чтобы сделать строчными все буквы, используйте "${foo,,}". Для ввода всех букв в верхний регистр используйте "${foo^^}".
Стив
1
Я случайно это заметил ${foo~}и ${foo~~}имею такой же эффект как ${foo^}и ${foo^^}. Но я никогда не видел, чтобы эта альтернатива упоминалась где-либо.
Mivk
5
Похоже, это не работает на Mac. получаю следующую ошибку:bad substitution
Toland Hon
1
@TolandHon: Как вы, вероятно, уже разобрались, вам нужно будет обновить до версии 4.x или попробовать другое решение, если по какой-либо причине этот компьютер не может быть обновлен.
не работает на MacOS10 Lion sed, вздох, \ u расширяется до вас вместо того, чтобы быть оператором.
vwvan
2
@vwvan brew install coreutils gnu-sedи следуйте инструкциям, чтобы использовать команды без префикса g. Что бы это ни стоило, я никогда не хотел запускать OSX-версию этих команд с момента получения версий GNU.
Дин
@vwvan: Да, извините, sedв этом случае вам понадобится GNU
Стив
2
@Dean: FWIW, я никогда не хотел запускать OSX :-)
Стив
5
Просто измените его на, sed 's/./\U&/и он будет работать на POSIX sed.
наконец то, что работает с переменной и на Mac! Спасибо!
Оззи
4
@DanieleOrlando, не такая портативная, как можно было бы надеяться. tr [:lower:] [:upper:]Это лучший выбор, если он должен работать на языке / языке, включающем буквы, которые не входят в диапазон a-zили A-Z.
Это можно сделать в чистом виде с помощью bash-3.2:
# First, get the first character.
fl=${foo:0:1}# Safety check: it must be a letter :).if[[ ${fl}==[a-z]]];then# Now, obtain its octal value using printf (builtin).
ord=$(printf '%o'"'${fl}")# Fun fact: [a-z] maps onto 0141..0172. [A-Z] is 0101..0132.# We can use decimal '- 40' to get the expected result!
ord=$(( ord -40))# Finally, map the new value back to a character.
fl=$(printf '%b''\'${ord})
fi
echo "${fl}${foo:1}"
как определить фу? Я пытался, foo = $1но я только получаю-bash: foo: command not found
Оззи
1
@ OZZIE, без пробелов =в заданиях. Это то, что shellcheck.net найдет для вас программно.
Чарльз Даффи
Я всегда забываю это о сценариях оболочки ... только язык, где один пробел (до / после) имеет значение ... вздох (python, по крайней мере, 4, если я правильно помню)
OZZIE
@OZZIE, то есть материи, потому что если это не имело значения, вы не могли бы передать в =качестве аргумента программы (как он должен знать , если someprogram =работает someprogram, или присвоение переменной с именем someprogram?)
foo='one two three'; foo=$(for i in $foo; do echo -n "${i^} "; done) Более короткое разрешение для каждого слова. foo Сейчас "Один Два Три"
vr286
Как я могу использовать первые 3 или 4 буквы в верхнем регистре? Как pqrs-123-v1 для PQRS-123-v1 ? Или вы можете сказать, что все буквы перед первым дефисом ...
Вики Дев
2
Альтернативное и чистое решение для Linux и OSX, его также можно использовать с переменными bash
Пожалуйста, напишите более чистый код! вам не хватает цитаты повсюду. Вы используете устаревший синтаксис (обратные метки); Вы используете устаревший синтаксис ( $[...]). Вы используете много бесполезных скобок. Вы предполагаете, что строка состоит из символов латинского алфавита (как насчет акцентированных букв или букв других алфавитов?). У вас есть много работы, чтобы сделать этот фрагмент полезным! (и так как вы используете регулярное выражение, вы можете также использовать регулярное выражение, чтобы найти первую букву вместо цикла).
gniourf_gniourf
6
Я думаю, что ты не прав. Это обязательный комментарий, который сопровождает отрицательный голос, объясняющий все неправильные образцы и неправильные представления об ответе. Пожалуйста, учитесь на своих ошибках (а до этого пытайтесь их понять) вместо того, чтобы быть упрямым. Быть хорошим парнем также несовместимо с распространением плохих практик.
gniourf_gniourf
1
Или, если вы используете Bash ≥4, вам не нужно tr:if [[ $S =~ ^([^[:alpha:]]*)([[:alpha:]].*) ]]; then out=${BASH_REMATCH[1]}${BASH_REMATCH[2]^}; else out=$S; fi; printf '%s\n' "$out"
gniourf_gniourf
5
Этот код все еще сильно сломан. Он по-прежнему использует обратные пометки вместо современного синтаксиса замещения; у этого все еще есть непревзойденные кавычки; в тех местах, где они действительно имеют значение, все еще отсутствуют цитаты ; и т. д. Попробуйте добавить в свои тестовые данные несколько пробельных символов, окруженных пробелами, если вы не верите, что пропущенные кавычки имеют значение, и исправьте проблемы, обнаруженные shellcheck.net, пока этот код не станет чистым.
Чарльз Даффи
2
Что касается языка, который вы цитировали с unix.stackexchange.com/questions/68694/… , то, что вы упускаете, echo $fooэто пример ситуации, когда парсер ожидает список слов ; так что в вашем echo ${F}, содержимое Fразделено на строки и глобально расширено. Это верно и для echo ${S:$N:1}примера, и для всего остального. Смотрите BashPitfalls # 14 .
Ответы:
источник
notQuiteCamel
вNotQuiteCamel
. Ваш вариант имеет побочный эффект или заставляет оставшиеся в нижнем регистре за счет удвоения количества вложенных оболочек и tr процессов.bash
.В одну сторону с bash (версия 4+):
печатает:
источник
"${foo,}"
. Чтобы сделать строчными все буквы, используйте"${foo,,}"
. Для ввода всех букв в верхний регистр используйте"${foo^^}"
.${foo~}
и${foo~~}
имею такой же эффект как${foo^}
и${foo^^}
. Но я никогда не видел, чтобы эта альтернатива упоминалась где-либо.bad substitution
Один из способов с
sed
:Печать:
источник
brew install coreutils gnu-sed
и следуйте инструкциям, чтобы использовать команды без префиксаg
. Что бы это ни стоило, я никогда не хотел запускать OSX-версию этих команд с момента получения версий GNU.sed
в этом случае вам понадобится GNUsed 's/./\U&/
и он будет работать на POSIX sed.источник
Вот «родной» способ работы с текстом:
источник
tr [:lower:] [:upper:]
Это лучший выбор, если он должен работать на языке / языке, включающем буквы, которые не входят в диапазонa-z
илиA-Z
.Использование только awk
источник
Это можно сделать в чистом виде с помощью bash-3.2:
источник
foo = $1
но я только получаю-bash: foo: command not found
=
в заданиях. Это то, что shellcheck.net найдет для вас программно.=
качестве аргумента программы (как он должен знать , еслиsomeprogram =
работаетsomeprogram
, или присвоение переменной с именемsomeprogram
?)Это тоже работает ...
И так далее.
Источники:
Inroductions / Обучающие программы:
источник
Прописать только первое слово:
Чтобы использовать каждое слово в переменной с большой буквы :
(работает в Bash 4+)
источник
foo='one two three'; foo=$(for i in $foo; do echo -n "${i^} "; done)
Более короткое разрешение для каждого слова. foo Сейчас "Один Два Три"Альтернативное и чистое решение для Linux и OSX, его также можно использовать с переменными bash
возвращает Abc
источник
Этот работал для меня:
Поиск всех * php файлов в текущем каталоге и замена первого символа каждого имени файла на заглавную букву:
Например: test.php => Test.php
источник
просто для удовольствия вот вы:
источник
Не совсем то, что просили, но довольно полезно
И наоборот
источник
first-letter-to-lower-xc () {v-first-letter-to-lower | xclip -selection clipboard}
источник
Что если первый символ не буква (а табуляция, пробел и экранированная двойная кавычка)? Нам лучше проверить это, пока мы не найдем письмо! Так:
источник
$[...]
). Вы используете много бесполезных скобок. Вы предполагаете, что строка состоит из символов латинского алфавита (как насчет акцентированных букв или букв других алфавитов?). У вас есть много работы, чтобы сделать этот фрагмент полезным! (и так как вы используете регулярное выражение, вы можете также использовать регулярное выражение, чтобы найти первую букву вместо цикла).tr
:if [[ $S =~ ^([^[:alpha:]]*)([[:alpha:]].*) ]]; then out=${BASH_REMATCH[1]}${BASH_REMATCH[2]^}; else out=$S; fi; printf '%s\n' "$out"
echo $foo
это пример ситуации, когда парсер ожидает список слов ; так что в вашемecho ${F}
, содержимоеF
разделено на строки и глобально расширено. Это верно и дляecho ${S:$N:1}
примера, и для всего остального. Смотрите BashPitfalls # 14 .