在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环境是:
- GNU bash,版本4.1.2(1)-release(x86_64-redhat-linux-gnu)
- 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:]'`"