如何在Bash中将字符串转换为小写?

遇到的问题:

有一种方法可以将字符串转换为小写字符串?

例如,如果我有:

 a="Hi all" 

我想将其转换为:

 "hi all" 

解决方案:

解决方案一

有多种方式:

POSIX标准

TR

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

AWK

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

非POSIX

您可能会遇到以下示例的可移植性问题:

重击4.0

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

sed

 $ echo "$a" | sed -e 's/\(.*\)/\L\1/'
hi all
# this also works:
$ sed -e 's/\(.*\)/\L\1/' <<< "$a"
hi all 

佩尔

 $ 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 

注意:YMMV就此。 即使使用shopt -u nocasematch;它也对我不起作用(GNU bash版本4.2.46和4.0.33(具有相同的行为2.05b.0,但未实现nocasematch)) shopt -u nocasematch; 取消设置nocasematch会导致[[“” fooBaR“ ==” FOObar“]]奇怪地匹配[Bz]内的情况,但[AZ]错误地匹配了[Bz]。 Bash被双负数(“ uncasematch”)弄糊涂了! :-)

解决方案二

在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 

切换(未记录,但可以在编译时配置)

 $ 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 

大写(未记录,但可以在编译时配置)

 $ 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"
A few words 

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

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

编辑:

ghostdog74所建议,添加了“按单词切换第一个字符”( ${var~} var〜 ${var~} )。

编辑:更正了波浪号行为,以匹配Bash 4.3。

解决方案三

 echo "Hi All" | tr "[:upper:]" "[:lower:]" 
阅读 555 次发布于 2019年12月26日
推荐阅读
为什么处理排序数组要比处理未排序数组快?

这是一段C ++代码,显示了一些非常特殊的行为。 出于某些奇怪的原因,奇迹般地对数据进行排序使代码快了将近六倍: #include #include #include int main() { // Generate data const unsigned arraySize = 32768; int da...

2019-12-20 阅读 18

如何撤消Git中的最新本地提交?

我不小心将错误的文件提交给Git ,但是我还没有将提交推送到服务器。 如何撤消本地存储库中的那些提交?

2019-12-20 阅读 31

如何在本地和远程删除Git分支?

我想在本地和远程删除分支。 尝试删除远程分支失败 $ git branch -d remotes/origin/bugfix error: branch 'remotes/origin/bugfix' not found. $ git branch -d origin/bugfix error: branch 'origin/bugfix' not found. $ git branch ...

2019-12-20 阅读 21

'git pull'和'git fetch'有什么区别?

主持人注意:鉴于此问题已经发布了67个答案 (其中一些已删除),请在发布另一个问题之前考虑您是否正在贡献新内容 。 git pull和git fetch什么区别?

2019-12-20 阅读 23

什么是正确的JSON内容类型?

我一直在弄乱JSON一段时间,只是将其作为文本推出,并没有伤害任何人(据我所知),但是我想正确地做事。 我已经看到许多所谓的JSON内容类型的“标准”: application/json application/x-javascript text/javascript text/x-javascript text/x-json 但是哪一个是正确的,还是最好的? 我发现在它们之间存在安全性和浏览...

2019-12-20 阅读 30

目录