在Bash中将string转换为小写

有没有在bash中将string转换为小写string的方法?

例如,如果我有:

a="Hi all" 

我想将其转换为:

 "hi all" 

有不同的方法:

TR

 $ echo "$a" | tr '[:upper:]' '[:lower:]' hi all 

AWK

 $ echo "$a" | awk '{print tolower($0)}' hi all 

Bash 4.0

 $ echo "${a,,}" hi all 

Perl的

 $ echo "$a" | perl -ne 'print lc' hi all 

巴什

 lc(){ case "$1" in [AZ]) n=$(printf "%d" "'$1") n=$((n+32)) printf \\$(printf "%o" "$n") ;; *) printf "%s" "$1" ;; esac } word="I Love Bash" for((i=0;i<${#word};i++)) do ch="${word:$i:1}" lc "$ch" done 

在Bash 4:

小写

 $ string="A FEW WORDS" $ echo "${string,}" a FEW WORDS $ echo "${string,,}" a few words $ echo "${string,,[AEIUO]}" a FeW WoRDS $ string="A Few Words" $ declare -l string $ string=$string; echo "$string" a few words 

以大写字母

 $ string="a few words" $ echo "${string^}" A few words $ echo "${string^^}" A FEW WORDS $ echo "${string^^[aeiou]}" A fEw wOrds $ string="A Few Words" $ declare -u string $ string=$string; echo "$string" A FEW WORDS 

切换(无文档,但可以在编译时configuration)

 $ string="A Few Words" $ echo "${string~~}" a fEW wORDS $ string="A FEW WORDS" $ echo "${string~}" a FEW WORDS $ string="a few words" $ echo "${string~}" A few words 

大写(无文档,但可以在编译时进行configuration)

 $ string="a few words" $ declare -c string $ string=$string $ echo "$string" A few words 

标题案例:

 $ string="a few words" $ string=($string) $ string="${string[@]^}" $ echo "$string" A Few Words $ declare -c string $ string=(a few words) $ echo "${string[@]}" A Few Words $ string="a FeW WOrdS" $ string=${string,,} $ string=${string~} $ echo "$string" 

要closuresdeclare属性,请使用+ 。 例如, declare +c string 。 这影响后续分配,而不是当前值。

declare选项更改variables的属性,但不更改内容。 我的示例中的重新分配更新内容以显示更改。

编辑:

按照ghostdog74的build议添加了“按字切换第一个字符”( ${var~} var〜 ${var~} )。

编辑:更正了代字符的行为来匹配Bash 4.3。

 echo "Hi All" | tr "[:upper:]" "[:lower:]" 

tr :

 a="$(tr [AZ] [az] <<< "$a")" 

AWK :

 { print tolower($0) } 

sed :

 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ 

我知道这是一个古老的职位,但我做了另一个网站的答案,所以我想我会在这里发布:

UPPER – > lower :使用python:

 b=`echo "print '$a'.lower()" | python` 

或Ruby:

 b=`echo "print '$a'.downcase" | ruby` 

或Perl(可能是我最喜欢的):

 b=`perl -e "print lc('$a');"` 

或PHP:

 b=`php -r "print strtolower('$a');"` 

或Awk:

 b=`echo "$a" | awk '{ print tolower($1) }'` 

或者Sed:

 b=`echo "$a" | sed 's/./\L&/g'` 

或者Bash 4:

 b=${a,,} 

或NodeJS,如果你有它(有点坚果…):

 b=`echo "console.log('$a'.toLowerCase());" | node` 

你也可以使用dd (但我不会!):

 b=`echo "$a" | dd conv=lcase 2> /dev/null` 

下 – >上

使用python:

 b=`echo "print '$a'.upper()" | python` 

或Ruby:

 b=`echo "print '$a'.upcase" | ruby` 

或Perl(可能是我最喜欢的):

 b=`perl -e "print uc('$a');"` 

或PHP:

 b=`php -r "print strtoupper('$a');"` 

或Awk:

 b=`echo "$a" | awk '{ print toupper($1) }'` 

或者Sed:

 b=`echo "$a" | sed 's/./\U&/g'` 

或者Bash 4:

 b=${a^^} 

或NodeJS,如果你有它(有点坚果…):

 b=`echo "console.log('$a'.toUpperCase());" | node` 

你也可以使用dd (但我不会!):

 b=`echo "$a" | dd conv=ucase 2> /dev/null` 

另外,当你说'shell'时,我假设你的意思是bash但是如果你可以使用zsh ,就像

 b=$a:l 

为小写和

 b=$a:u 

为大写。

在zsh:

 echo $a:u 

得爱zsh!

使用GNU sed

 sed 's/.*/\L&/' 

例:

 $ foo="Some STRIng"; $ foo=$(echo "$foo" | sed 's/.*/\L&/') $ echo "$foo" some string 

对于只使用内build函数的标准shell(没有bashisms):

 uppers=ABCDEFGHIJKLMNOPQRSTUVWXYZ lowers=abcdefghijklmnopqrstuvwxyz lc(){ #usage: lc "SOME STRING" -> "some string" i=0 while ([ $i -lt ${#1} ]) do CUR=${1:$i:1} case $uppers in *$CUR*)CUR=${uppers%$CUR*};OUTPUT="${OUTPUT}${lowers:${#CUR}:1}";; *)OUTPUT="${OUTPUT}$CUR";; esac i=$((i+1)) done echo "${OUTPUT}" } 

而对于大写字母:

 uc(){ #usage: uc "some string" -> "SOME STRING" i=0 while ([ $i -lt ${#1} ]) do CUR=${1:$i:1} case $lowers in *$CUR*)CUR=${lowers%$CUR*};OUTPUT="${OUTPUT}${uppers:${#CUR}:1}";; *)OUTPUT="${OUTPUT}$CUR";; esac i=$((i+1)) done echo "${OUTPUT}" } 

正则expression式

我想赞扬我希望分享的命令,但事实是我从http://commandlinefu.com获得了我自己使用的命令。; 它的优点是,如果你cd到你自己的home文件夹中的任何目录,它会将所有的文件和文件夹recursion地改为小写,请谨慎使用。 这是一个精彩的命令行修复,对于你存储在驱动器中的大量相册特别有用。

 find . -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \; 

您可以在查找之后指定一个目录代替点(。),表示当前目录或完整path。

我希望这个解决schemecertificate是有用的,这个命令不做的一件事是用下划线replace空格 – 哦,好吧,另一次也许。

在bash 4中,你可以使用排版

例:

 A="HELLO WORLD" typeset -l A=$A 

前Bash 4.0

Bash降低string的大小写并分配给variables

 VARIABLE=$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]') echo "$VARIABLE" 

你可以试试这个

 s="Hello World!" echo $s # Hello World! a=${s,,} echo $a # hello world! b=${s^^} echo $b # HELLO WORLD! 

在这里输入图像描述

ref: http : //wiki.workassis.com/shell-script-convert-text-to-lowercase-and-uppercase/

对于早于4.0的Bash版本,这个版本应该是最快的(因为它不fork / exec任何命令):

 function string.monolithic.tolower { local __word=$1 local __len=${#__word} local __char local __octal local __decimal local __result for (( i=0; i<__len; i++ )) do __char=${__word:$i:1} case "$__char" in [AZ] ) printf -v __decimal '%d' "'$__char" printf -v __octal '%03o' $(( $__decimal ^ 0x20 )) printf -v __char \\$__octal ;; esac __result+="$__char" done REPLY="$__result" } 

技术龙的答案也有潜力,虽然它确实为我运行。

如果使用v4,这是烘烤 。 如果不是,这是一个简单的,广泛适用的解决scheme。 其他答案(和评论)在这个线程是相当有用的创build下面的代码。

 # Like echo, but converts to lowercase echolcase () { tr [:upper:] [:lower:] <<< "${*}" } # Takes one arg by reference (var name) and makes it lowercase lcase () { eval "${1}"=\'$(echo ${!1//\'/"'\''"} | tr [:upper:] [:lower:] )\' } 

笔记:

  • 做: a="Hi All" ,然后: lcase a将做同样的事情: a=$( echolcase "Hi All" )
  • 在lcase函数中,使用${!1//\'/"'\''"}而不是${!1} ,即使string有引号也可以使用。

尽pipe这个问题的年龄有多大,类似于这个技术龙的答案 。 我很难find一个在大多数平台(我使用)以及老版本的bash中都可移植的解决scheme。 我也对数组,函数和打印,回声和临时文件检索琐碎variables的使用感到沮丧。 到目前为止,这对我来说效果很好,我以为我会分享。 我的主要testing环境是:

  1. GNU bash,版本4.1.2(1)-release(x86_64-redhat-linux-gnu)
  2. GNU bash,版本3.2.57(1) – 释放(sparc-sun-solaris2.10)
 lcs="abcdefghijklmnopqrstuvwxyz" ucs="ABCDEFGHIJKLMNOPQRSTUVWXYZ" input="Change Me To All Capitals" for (( i=0; i<"${#input}"; i++ )) ; do : for (( j=0; j<"${#lcs}"; j++ )) ; do : if [[ "${input:$i:1}" == "${lcs:$j:1}" ]] ; then input="${input/${input:$i:1}/${ucs:$j:1}}" fi done done 

简单的C风格循环遍历string。 对于下面这行,如果你以前没有见过这样的东西,那么我才知道这一点 。 在这种情况下,这一行检查input中是否存在char $ {input:$ i:1}(小写),如果用给定的char $ {ucs:$ j:1}(大写)replace它并存储它回到input。

 input="${input/${input:$i:1}/${ucs:$j:1}}" 

许多答案使用外部程序,这是不是真的使用Bash

如果你知道你会有Bash4,你应该使用${VAR,,}符号(这很简单,很酷)。 对于Bash之前4(我的Mac仍然使用Bash 3.2例如)。 我使用了@ ghostdog74的答案的更正版本来创build一个更便携的版本。

一个你可以调用lowercase 'my STRING'并得到一个小写的版本。 我读了关于将结果设置为var的注释,但是在Bash这不是真正的可移植性,因为我们不能返回string。 打印它是最好的解决scheme。 很容易捕获像var="$(lowercase $str)"

这是如何工作的

这种方式的工作方式是通过获取每个字符的ASCII整数表示与printf ,然后adding 32如果upper-to->lower ,或subtracting 32如果lower-to->upper 。 然后再次使用printf将数字转换回char。 从'A' -to-> 'a'我们有32个字符的区别。

使用printf来解释:

 $ printf "%d\n" "'a" 97 $ printf "%d\n" "'A" 65 

97 - 65 = 32

这是带有例子的工作版本。
请注意代码中的注释,因为他们解释了很多东西:

 #!/bin/bash # lowerupper.sh # Prints the lowercase version of a char lowercaseChar(){ case "$1" in [AZ]) n=$(printf "%d" "'$1") n=$((n+32)) printf \\$(printf "%o" "$n") ;; *) printf "%s" "$1" ;; esac } # Prints the lowercase version of a sequence of strings lowercase() { word="$@" for((i=0;i<${#word};i++)); do ch="${word:$i:1}" lowercaseChar "$ch" done } # Prints the uppercase version of a char uppercaseChar(){ case "$1" in [az]) n=$(printf "%d" "'$1") n=$((n-32)) printf \\$(printf "%o" "$n") ;; *) printf "%s" "$1" ;; esac } # Prints the uppercase version of a sequence of strings uppercase() { word="$@" for((i=0;i<${#word};i++)); do ch="${word:$i:1}" uppercaseChar "$ch" done } # The functions will not add a new line, so use echo or # append it if you want a new line after printing # Printing stuff directly lowercase "I AM the Walrus!"$'\n' uppercase "I AM the Walrus!"$'\n' echo "----------" # Printing a var str="A StRing WITH mixed sTUFF!" lowercase "$str"$'\n' uppercase "$str"$'\n' echo "----------" # Not quoting the var should also work, # since we use "$@" inside the functions lowercase $str$'\n' uppercase $str$'\n' echo "----------" # Assigning to a var myLowerVar="$(lowercase $str)" myUpperVar="$(uppercase $str)" echo "myLowerVar: $myLowerVar" echo "myUpperVar: $myUpperVar" echo "----------" # You can even do stuff like if [[ 'option 2' = "$(lowercase 'OPTION 2')" ]]; then echo "Fine! All the same!" else echo "Ops! Not the same!" fi exit 0 

并运行这个结果后:

 $ ./lowerupper.sh i am the walrus! I AM THE WALRUS! ---------- a string with mixed stuff! A STRING WITH MIXED STUFF! ---------- a string with mixed stuff! A STRING WITH MIXED STUFF! ---------- myLowerVar: a string with mixed stuff! myUpperVar: A STRING WITH MIXED STUFF! ---------- Fine! All the same! 

这应该只适用于ASCII字符

对我来说,这是好的,因为我知道我只会通过ASCII字符。
例如,我将其用于一些不区分大小写的CLI选项。

将转换的string存储到variables中。 以下为我工作 – $SOURCE_NAME to $TARGET_NAME

 TARGET_NAME="`echo $SOURCE_NAME | tr '[:upper:]' '[:lower:]'`"