Преобразование строки из верхнего регистра в нижний регистр в Bash
Я искал способ преобразования строкового значения из верхнего регистра в нижний регистр. Все результаты поиска показывают подходы к использованию команды tr
.
Проблема с командой tr
заключается в том, что я могу получить результат только тогда, когда я использую команду с выражением echo. Например:
y="HELLO"
echo $y| tr '[:upper:]' '[:lower:]'
Вышеупомянутые работы и результаты в "привет", но мне нужно присвоить результат переменной, как показано ниже:
y="HELLO"
val=$y| tr '[:upper:]' '[:lower:]'
string=$val world
При назначении значения, как указано выше, он дает мне пустой результат.
PS: Моя версия Bash - 3.1.17
Ответы
Ответ 1
Если вы используете bash 4, вы можете использовать следующий подход:
x="HELLO"
echo $x # HELLO
y=${x,,}
echo $y # hello
z=${y^^}
echo $z # HELLO
Используйте только один ,
или ^
, чтобы сделать первую букву lowercase
или uppercase
.
Ответ 2
Правильный способ реализации кода -
y="HELLO"
val=$(echo "$y" | tr '[:upper:]' '[:lower:]')
string="$val world"
Используется обозначение $(...)
для захвата вывода команды в переменной. Обратите внимание также на кавычки вокруг переменной string
- они вам нужны, чтобы указать, что $val
и world
- это одна вещь, которую нужно назначить string
.
Если у вас bash
4.0 или выше, более эффективный и элегантный способ сделать это - использовать bash
встроенную строчную манипуляцию:
y="HELLO"
string="${y,,} world"
Ответ 3
Почему бы не выполнить в backticks?
x=`echo "$y" | tr '[:upper:]' '[:lower:]'`
Это присваивает результат команды в backticks переменной x
. (то есть это не относится к tr
, а является общим шаблоном/решением для сценариев оболочки)
Вместо backticks вы можете использовать $(..)
. См. здесь для получения дополнительной информации.
Ответ 4
Обратите внимание, что tr
может обрабатывать только обычный ASCII, что делает любое решение на основе tr
неудачным при обращении к международным символам.
То же самое относится к решению ${x,,}
на основе bash 4.
Инструмент awk
, с другой стороны, правильно поддерживает даже вход UTF-8/multibyte.
y="HELLO"
val=$(echo "$y" | awk '{print tolower($0)}')
string="$val world"
Ответ любезно liborw.
Ответ 5
Это сработало для меня. Спасибо Роди!
y="HELLO"
val=$(echo $y | tr '[:upper:]' '[:lower:]')
string="$val world"
одна небольшая модификация, если вы используете символ подчеркивания рядом с переменной. Вам нужно инкапсулировать имя переменной в {}.
string="${val}_world"
Ответ 6
Если вы определяете свою переменную с помощью declare (old: typeset), тогда вы можете указать случай значения во всей переменной.
$ declare -u FOO=AbCxxx
$ echo $FOO
ABCXXX
"-l"
делает lc.
Ответ 7
Я думал, что перейду и добавлю более прямой ответ для тех, кто все еще находит это на вершине Google, как я.
Я на Ubuntu 14.04, с Bash версией 4.3.11. Тем не менее, у меня все еще нет веселья, встроенного в строковое манипулирование ${y,,}
Это то, что я использовал в моей script для принудительной капитализации:
CAPITALIZED=`echo "${y}" | tr '[a-z]' '[A-Z]'`