Команда для преобразования строки в верхнем регистре в нижний регистр?

43

Что такое команда Bash, которую я могу использовать для преобразования строчной строки в нижний регистр и наоборот?

Спасибо.

    
задан Ten-Coin 28.11.2013 в 14:03
источник

7 ответов

52

Если строка уже сохранена в переменной, вы можете использовать расширение параметра bash , в частности ${parameter,,pattern} (доступно после bash 4.0), где parameter - это имя вашей переменной, а pattern опущено

$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!

Обратите внимание, что это не меняет значение переменной, а только выход. Чтобы изменить переменную, вам необходимо назначить новое значение:

$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!

Преобразование в верхнем регистре работает с ${parameter^^pattern} :

$ echo ${string^^}
HELLO, WORLD!

Это работает также со строками Unicode (по крайней мере, с текущими версиями bash, возможно, требуется хотя бы bash 4.3):

$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ

Если вы используете zsh , вы можете использовать флаги расширения параметров ( ${(FLAGS)NAME} , доступные с zsh 2.5) для достижения тех же результатов. Синтаксис bash не работает в zsh 1) . Флаг для нижнего регистра - L ; для верхнего регистра это U :

$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"

Это также работает с строками Unicode (по крайней мере с zsh 5.0, я не пытался с более ранними версиями):

$ string='ἈΛΦΆβητος'
$ echo ${(L)string} 
ἀλφάβητος
$ echo ${(U)string}  
ἈΛΦΆΒΗΤΟΣ

1) Хотя, видя, что zsh имеет это намного дольше, вероятно, должно быть: "синтаксис zsh не работает в bash .     

ответ дан Adaephon 28.11.2013 в 14:18
источник
37

В Unicode очень мало методов, которые работают правильно:

GNU sed 4.2.2 работает :

$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ

bash 4.2.45 объявляет работу не :

$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą

bash 4.2.45 расширение параметра работает не :

$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą

bash 4.3.42 declare и расширение параметра работа :

$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąką

GNU tr 8.20 работает не :

$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą

mawk (по умолчанию awk в Ubuntu 13.10) работает не :

$ echo "Idą gęsi łąką" | mawk '{print toupper(
$ echo "Idą gęsi łąką" | gawk '{print toupper(
$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKą
)}' IDĄ GĘSI ŁĄKĄ
)}' IDą GęSI łąKą

gawk работает :

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą

Perl pure uc () выполняет не работу:

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄ

Python 2 без подсказок Unicode работает не :

$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ

Python 2, когда ему поручено работать с Unicode works :

%pre%

Python 3 работает :

%pre%     
ответ дан Michał Šrajer 29.11.2013 в 16:37
20

Я бы использовал встроенную команду bash typeset или declare для определения строчной переменной.

$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case

Символы опущены, когда значение установлено, а не когда вы набираете переменную. Так что лучше набирать в начале скрипта. Для прописных букв вы можете набрать -u .

$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE

Это не относится к оболочке bash, которая также работает на ksh, возможно, в определении оболочки POSIX.

EDIT: Многие люди нежно указали мне на то, что набор теперь считается устаревшим на bash и заменяется на declare . Обе команды эквивалентны.

$ help typeset
typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
    Set variable values and attributes.

    Obsolete.  See 'help declare'.


$ help declare
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
    Set variable values and attributes.

Я все еще использую синтаксис набора, когда я работаю в гетерогенной среде, поэтому мне не нужно переписывать свои сценарии.

    
ответ дан Emmanuel 28.11.2013 в 16:25
16

Вы можете сделать это с помощью команды tr .

В терминале ( Ctrl + Alt + T )

Эта команда:

echo 'String here' | tr "[:lower:]" "[:upper:]"

преобразует строчные буквы в верхний регистр.

echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"

преобразует верхний регистр в нижний регистр.

Пример:

Кредит переходит на кибернетику

    
ответ дан Ten-Coin 28.11.2013 в 14:12
9

Вы также можете перетаскивать вещи через sed :

$ echo lowercase | sed 's/.*/\U&/'
LOWERCASE

И \L будет иметь противоположный эффект:

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase
    
ответ дан Oli 28.11.2013 в 14:26
1

Это не чистое решение bash, но вы можете передавать свои строки через perl (как Oli с sed ):

$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE

И \L будет иметь противоположный эффект:

$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase
    
ответ дан Sylvain Pineau 22.09.2014 в 14:25
-1

Используйте эту простую команду Для верхнего и нижнего регистра Где «f» - это имя файла, в котором вы хотите выполнить преобразование.

tr "A-Z" "a-z" < f

Для нижнего к верхнему регистру

tr "a-z" "A-Z" < f
    
ответ дан jack 14.10.2014 в 02:25