Я хочу прописати лише великі літери в моєму рядку з bash.
foo="bar";
//uppercase first character
echo $foo;
слід надрукувати "Бар";
Я хочу прописати лише великі літери в моєму рядку з bash.
foo="bar";
//uppercase first character
echo $foo;
слід надрукувати "Бар";
Відповіді:
foo="$(tr '[:lower:]' '[:upper:]' <<< ${foo:0:1})${foo:1}"
notQuiteCamelна NotQuiteCamel. Ваш варіант має побічний ефект або примушує решту до малих рекордів - ціною подвоєння кількості додаткових оболонок і тр.
bash.
Один спосіб з bash (версія 4+):
foo=bar
echo "${foo^}"
відбитки:
Bar
"${foo,}". Щоб прописати всі літери, використовуйте "${foo,,}". Для великих літер використовуйте великі літери "${foo^^}".
${foo~}і ${foo~~}має такий же ефект, як ${foo^}і ${foo^^}. Але я ніде не бачив такої альтернативи, згаданої ніде.
bad substitution
Один із способів sed:
echo "$(echo "$foo" | sed 's/.*/\u&/')"
Друкує:
Bar
brew install coreutils gnu-sedі дотримуйтесь інструкцій щодо використання команд без префікса g. Чого варто, я ніколи не хотів запускати версію OSX цих команд з моменту отримання версій GNU.
sedв цьому випадку
sed 's/./\U&/і він працюватиме на POSIX sed.
$ foo="bar";
$ foo=`echo ${foo:0:1} | tr '[a-z]' '[A-Z]'`${foo:1}
$ echo $foo
Bar
Ось "рідний" спосіб текстових інструментів:
#!/bin/bash
string="abcd"
first=`echo $string|cut -c1|tr [a-z] [A-Z]`
second=`echo $string|cut -c2-`
echo $first$second
tr [:lower:] [:upper:]є кращим вибором, якщо йому потрібно працювати в мові / локалі, включаючи букви, яких немає в діапазоні a-zабо A-Zдіапазоні.
Використовуючи лише awk
foo="uNcapItalizedstrIng"
echo $foo | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}'
Це також можна зробити в чистому стилі з 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
=у завданнях немає пробілів . Це те, що shellcheck.net знайде для вас програмно.
=як аргумент програмі (як він повинен знати, чи someprogram =працює someprogram, або присвоїти змінну на ім'я someprogram?)
Це теж працює ...
FooBar=baz
echo ${FooBar^^${FooBar:0:1}}
=> Baz
FooBar=baz
echo ${FooBar^^${FooBar:1:1}}
=> bAz
FooBar=baz
echo ${FooBar^^${FooBar:2:2}}
=> baZ
І так далі.
Джерела:
Введення / Підручники:
Використовуйте великі літери лише для першого слова:
foo='one two three'
foo="${foo^}"
echo $foo
О не два три
Щоб використовувати великі літери у кожному змінному:
foo="one two three"
foo=( $foo ) # without quotes
foo="${foo[@]^}"
echo $foo
O ne T wo T hree
(працює в bash 4+)
foo='one two three'; foo=$(for i in $foo; do echo -n "${i^} "; done) Коротше роздільна здатність кожного слова. foo Зараз "Один Дві Три"
Альтернативне і чисте рішення як для Linux, так і для OSX, воно також може використовуватися з bash змінними
python -c "print(\"abc\".capitalize())"
повертає Abc
Цей працював на мене:
Пошук усіх * php-файлів у поточному каталозі та замінення першого символу кожного імені файлу на велику літеру:
наприклад: test.php => Test.php
for f in *php ; do mv "$f" "$(\sed 's/.*/\u&/' <<< "$f")" ; done
Не зовсім те, що просили, але цілком корисно
declare -u foo #When the variable is assigned a value, all lower-case characters are converted to upper-case.
foo=bar
echo $foo
BAR
І навпаки
declare -l foo #When the variable is assigned a value, all upper-case characters are converted to lower-case.
foo=BAR
echo $foo
bar
first-letter-to-lower () {
str=""
space=" "
for i in $@
do
if [ -z $(echo $i | grep "the\|of\|with" ) ]
then
str=$str"$(echo ${i:0:1} | tr '[A-Z]' '[a-z]')${i:1}$space"
else
str=$str${i}$space
fi
done
echo $str
}
first-letter-to-upper-xc () {
v-first-letter-to-upper | xclip -selection clipboard
}
first-letter-to-upper () {
str=""
space=" "
for i in $@
do
if [ -z $(echo $i | grep "the\|of\|with" ) ]
then
str=$str"$(echo ${i:0:1} | tr '[a-z]' '[A-Z]')${i:1}$space"
else
str=$str${i}$space
fi
done
echo $str
}
перша буква-до-нижня-xc () {v-перша-буква-до-нижня | xclip - вибір буфера обміну}
Що робити, якщо перший символ - це не буква (а вкладка, пробіл та уникнута подвійна цитата)? Ми краще перевіримо його, поки не знайдемо листа! Так:
S=' \"ó foo bar\"'
N=0
until [[ ${S:$N:1} =~ [[:alpha:]] ]]; do N=$[$N+1]; done
#F=`echo ${S:$N:1} | tr [:lower:] [:upper:]`
#F=`echo ${S:$N:1} | sed -E -e 's/./\u&/'` #other option
F=`echo ${S:$N:1}
F=`echo ${F} #pure Bash solution to "upper"
echo "$F"${S:(($N+1))} #without garbage
echo '='${S:0:(($N))}"$F"${S:(($N+1))}'=' #garbage preserved
Foo bar
= \"Foo bar=
$[...]). Ви використовуєте безліч марних дужок. Ви припускаєте, що рядок складається з символів з латинського алфавіту (як щодо наголошених букв чи букв інших алфавітів?). Ви маєте велику роботу, щоб зробити цей фрагмент корисним! (а оскільки ви використовуєте регулярний вираз, ви можете також використовувати регулярний вираз, щоб знайти першу літеру, а не цикл).
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 .