$ echo "$a" | tr '[:upper:]' '[:lower:]'
hi all
$ echo "$a" | awk '{print tolower($0)}'
hi all
以下示例可能会遇到可移植性问题:
$ echo "${a,,}"
hi all
$ 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
[A-Z])
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
nocasematch
未实现)),即使使用shopt -u nocasematch;
也不行。取消设置nocasematch
会导致[[ "fooBaR" == "FOObar" ]]
匹配成功,但在case语句内部,奇怪的是[b-z]
被[A-Z]
错误地匹配。Bash被双重否定(“取消设置nocasematch”)所困惑! :-)word="Hi All"
,它会返回ha
而不是hi all
。它只适用于大写字母并跳过已经小写的字母。 - jangostevetr
е’Њawk
з¤єдѕ‹ењЁPOSIXж ‡е‡†дёеѕ—е€°дє†жЊ‡е®љгЂ‚ - Richard Hansentr '[:upper:]' '[:lower:]'
会使用当前语言环境来确定大写/小写的对应关系,因此它可以适用于使用带变音符号字母的语言环境。 - Richard Hansena
中的大写字母转换成小写字母,并将结果存储在变量b
中。具体实现是通过使用tr
命令,将所有出现在[A-Z]
字符集中的字符替换为对应的小写字母,然后将结果赋值给变量b
。 - Tino$ 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~}
)。
编辑:更正波浪线行为以匹配Bash 4.3。 返回 "ŁÓDŹ",但是
echo ${string^^}返回 "łóDź"。即使在
LC_ALL=pl_PL.utf-8` 的环境下也是如此。这是在使用 Bash 4.2.24 版本。 - Hubert Karioen_US.UTF-8
,我也遇到了同样的问题。这是一个bug,我已经报告了。 - Dennis Williamsonecho "$string" | tr '[:lower:]' '[:upper:]'
。它可能会展示相同的失败。因此问题至少在某种程度上与Bash无关。 - Dennis Williamsonecho "Hi All" | tr "[:upper:]" "[:lower:]"
tr
对于非ASCII字符对我不起作用。 我已经设置了正确的区域设置并生成了区域设置文件。 你知道我可能做错了什么吗? - Hubert Kario[:upper:]
? - mgutt[:upper:]
。 - MaXi32tr
需要两个参数 - from
字符列表和 to
字符列表。[:upper:]
是一个字符类,它只是一种花哨的方式来表示所有大写字母的列表(尽管有些问题是关于 tr
是否正确地考虑了 Unicode 而不仅仅是 ASCII)。然后,[:lower:]
是所有小写字母的列表。tr
然后取两个列表并将 from
列表中的字符转换为 to
列表中对应的字符。因此,需要 [:upper:]
以便 tr
知道它应该更改什么,而 [:lower:]
告诉它要更改成什么。 - Dan Hunsakera="$(tr [A-Z] [a-z] <<< "$a")"
对我来说看起来最简单。我还是个初学者... - Sandeepan Nathsed
的解决方案; 我一直在一个没有 tr
的环境中工作,但我还没有遇到过没有 sed
的系统,而且许多时候,我想要做这件事情时已经用 sed
做了其他事情,因此可以将多个命令链接在一起成为一个(长)语句。 - Haravikktr [A-Z] [a-z] A
中,如果存在由单个字母组成的文件名或设置了 nullglob,则 shell 可能会执行文件名扩展。tr "[A-Z]" "[a-z]" A
将会正常工作。 - Dennissed
的系统。 - Haravikktr [A-Z] [a-z]
在几乎所有语言环境下都是不正确的。例如,在 en-US
语言环境中,A-Z
实际上是区间 AaBbCcDdEeFfGgHh...XxYyZ
。 - fuz我知道这是一个有些老旧的帖子,但我曾在另一个网站上回答了一个类似的问题,所以我想在这里发布它:
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=`node -p "\"$a\".toLowerCase()"`
您也可以使用 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) }'`
b=`echo "$a" | sed 's/./\U&/g'`
或者 Bash 4:
b=${a^^}
或者 NodeJS:
b=`node -p "\"$a\".toUpperCase()"`
您还可以使用dd
:
b=`echo "$a" | dd conv=ucase 2> /dev/null`
当您说“shell”时,我假设您指的是bash
,但如果您可以使用zsh
,那么这很容易实现:
b=$a:l
对于小写字母和
b=$a:u
转换成大写字母。
a
的值包含单引号,则不仅会破坏行为,而且还会造成严重的安全问题。 - tripleeesed 's/./\L&/g'
,但输出结果全是L... - Walter TrossBash 5.1通过L
参数转换提供了一种简单的方法来实现此目的:
${var@L}
例如,你可以这样说:
v="heLLo"
echo "${v@L}"
# hello
您还可以使用 U
来转换为大写:
v="hello"
echo "${v@U}"
# HELLO
使用 u
将第一个字母大写:
v="hello"
echo "${v@u}"
# Hello
${v^^}
еТМ${v,,}
еЈ≤зїПе≠ШеЬ®гАВ - Gostegaecho $a:u
真心喜欢zsh!
echo ${(C)a} #仅将第一个字符大写
- biocyberman${a:0:1:l}${a:1}
,只将第一个字符转换为小写。 - biocyberman使用 GNU sed
:
sed 's/.*/\L&/'
例子:
$ foo="Some STRIng";
$ foo=$(echo "$foo" | sed 's/.*/\L&/')
$ echo "$foo"
some string
在Bash 4.0之前
Bash将字符串转换为小写并赋值给变量
VARIABLE=$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')
echo "$VARIABLE"
echo
和管道:使用 $(tr '[:upper:]' '[:lower:]' <<<"$VARIABLE")
将变量转换为小写。 - Tino对于 Bash 命令行,根据语言环境和国际字母,这可能有效(结合他人的回答):
$ echo "ABCÆØÅ" | python -c "print(open(0).read().lower())"
abcæøå
$ echo "ABCÆØÅ" | sed 's/./\L&/g'
abcæøå
$ export a="ABCÆØÅ" | echo "${a,,}"
abcæøå
这些变化可能是无效的:
$ echo "ABCÆØÅ" | tr "[:upper:]" "[:lower:]"
abcÆØÅ
$ echo "ABCÆØÅ" | awk '{print tolower($1)}'
abcÆØÅ
$ echo "ABCÆØÅ" | perl -ne 'print lc'
abcÆØÅ
$ echo 'ABCÆØÅ' | dd conv=lcase 2> /dev/null
abcÆØÅ
echo "ABCÆØÅ" | ruby -pe '$_.downcase!'
正常工作吗? - Fravadona