What is the Bash command I can use to convert an upper-case string to lower-case and vice-versa?
Thank you.
27 Answers
If the string is already stored in a variable you can use bash's parameter expansion, specifially ${parameter,,pattern} (available since bash 4.0), where parameter is the name of your variable and pattern is ommitted:
$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!Note that this does not change the value of the variable, only the output. To change the variable you have to assign the new value:
$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!The upper-case conversion works with ${parameter^^pattern}:
$ echo ${string^^}
HELLO, WORLD!This works also with Unicode strings (at least with current bash versions, probably needs at least bash 4.3):
$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣIf you are using zsh, you can use Parameter Expansion Flags (${(FLAGS)NAME}; available since zsh 2.5) to achieve the same results. The bash syntax does not work in zsh 1). The flag for lower case is L; for upper case it is U:
$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"This also works with Unicode strings (at least since zsh 5.0; I did not try with earlier versions):
$ string='ἈΛΦΆβητος'
$ echo ${(L)string}
ἀλφάβητος
$ echo ${(U)string}
ἈΛΦΆΒΗΤΟΣ1) Although, seeing that zsh had this for far longer, it should probably be: "the zsh syntax does not work in bash.
There are very few methods that work correctly with Unicode:
GNU sed 4.2.2 works:
$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄbash 4.2.45 declare does not work:
$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKąbash 4.2.45 parameter expansion does not work:
$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKąbash 4.3.42 declare and parameter expansion work:
$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąkąGNU tr 8.20 does not work:
$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKąmawk (default awk in Ubuntu 13.10) does not work:
$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKągawk works:
$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'
IDĄ GĘSI ŁĄKĄPerl pure uc() does not work:
$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKąPython 2 without any Unicode hints does not work:
$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKąPython 2 when instructed to deal with Unicode works:
$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄPython 3 works:
$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ 5 I would use the bash internal typeset or declare command to define a lowercase variable.
$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower caseThe chars are lowered when the value is set, not when you typeset the variable. So it is better to typeset at the beginning of the script. For uppercase you can typeset -u.
$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASEThis is not specific to bash shell, that works also on ksh, maybe its in POSIX shell definition.
EDIT: Many people gently pointed me the fact that typeset is now considered obsolete on bash and replaced by declare. Both commands are equivalent.
$ 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.I myself still use the typeset syntax as I work on heterogeneous environment, so I have not to rewrite my scripts.
2You can do it with the tr command.
In the terminal (Ctrl+Alt+T)
This command:
echo 'String here' | tr "[:lower:]" "[:upper:]"will convert lowercase to uppercase.
echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"will convert uppercase to lowercase.
Example:
Credit goes to cybercity
2You can pipe things through sed too:
$ echo lowercase | sed 's/.*/\U&/'
LOWERCASEAnd \L will have the opposite effect:
$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase 0 It's not a pure bash solution, but you can pipe your strings through perl (as Oli did with sed):
$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASEAnd \L will have the opposite effect:
$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase Use this simple command For upper to lower case Where 'f' is file name where you want to do conversion.
tr "A-Z" "a-z" < fFor lower to upper case
tr "a-z" "A-Z" < f 1