如何在 Bash 中将字符串从大写转换为小写? [复制]

Posted

技术标签:

【中文标题】如何在 Bash 中将字符串从大写转换为小写? [复制]【英文标题】:How to convert a string from uppercase to lowercase in Bash? [duplicate] 【发布时间】:2012-07-08 16:22:52 【问题描述】:

我一直在寻找一种将字符串值从大写转换为小写的方法。所有搜索结果都显示了使用tr 命令的方法。

tr 命令的问题在于,我只有在使用带有 echo 语句的命令时才能得到结果。例如:

y="HELLO"
echo $y| tr '[:upper:]' '[:lower:]'

上述工作并产生“你好”,但我需要将结果分配给一个变量,如下所示:

y="HELLO"
val=$y| tr '[:upper:]' '[:lower:]'
string=$val world

当像上面那样分配值时,它会给我一个空的结果。

PS:我的 Bash 版本是 3.1.17

【问题讨论】:

对于文件:cat file_name | tr '[:upper:]' '[:lower:]' >> 低 【参考方案1】:

如果您使用的是 bash 4,则可以使用以下方法:

x="HELLO"
echo $x  # HELLO

y=$x,,
echo $y  # hello

z=$y^^
echo $z  # HELLO

仅使用一个,^ 组成第一个字母lowercaseuppercase

【讨论】:

感谢您的即时回复。当我尝试上述方法时,它说 $y,,--bad replacement。我如何尝试另一种方法 y="HI" val = $( tr '[A-Z]' '[a-z]' 您的 bash 版本过低。它不支持这些功能。 ,, ^^ 替换仅适用于 bash 4,不适用于 bash 3,因此您需要升级 bash 或使用 tr 方法。 如果返回错误的替换消息,还要检查你是否在变量名前不小心写了'$'($$y,,而不是$y,,),结果相同当 bash 版本太低时出错(您可以使用 'bash --version' 进行检查)。 我有一阵子很困惑,因为我正在做bash --version 并获得 5.0.3,但后来意识到这是 bash 的 brew 版本(/usr/local/bin/bash)。我的脚本在标题中有我的系统 bash #!/bin/bash 这是版本 3 :(【参考方案2】:

实现代码的正确方法是

y="HELLO"
val=$(echo "$y" | tr '[:upper:]' '[:lower:]')
string="$val world"

这使用$(...) 表示法在变量中捕获命令的输出。还要注意string 变量周围的引号——你需要它们来表示$valworld 是一个要分配给string 的东西。

如果您有bash 4.0 或更高版本,更高效和优雅的方法是使用bash 内置字符串操作:

y="HELLO"
string="$y,, world"

【讨论】:

echo $y 是错误的——如果你的y 包含,比如* HELLO *,那些*s 将被替换为文件名,三个空格的运行将被替换为每个.总是引用扩展:echo "$y" | tr ... @CharlesDuffy 确实,谢谢。已编辑。【参考方案3】:

请注意,tr 只能处理纯 ASCII,因此任何基于 tr 的解决方案在面对国际字符时都会失败。

基于 bash 4 的 $x,, 解决方案也是如此。

另一方面,awk 工具甚至可以正确支持 UTF-8 / 多字节输入。

y="HELLO"
val=$(echo "$y" | awk 'print tolower($0)')
string="$val world"

回答由liborw提供。

【讨论】:

【参考方案4】:

为什么不在反引号中执行?

 x=`echo "$y" | tr '[:upper:]' '[:lower:]'` 

这会将反引号中的命令结果分配给变量x。 (即它不是 tr 特有的,而是 shell 脚本的常见模式/解决方案)

您可以使用$(..) 代替反引号。请参阅here 了解更多信息。

【讨论】:

非常感谢您的回答。上面的作品..为了让它更好,我尝试了 y="HI" val = $( tr '[AZ]' '[az]' 需要引号:echo "$y",而不是 echo $y,或者通配符被扩展,空格被单个空格字符替换,等等。 @CharlesDuffy 确实,谢谢。已编辑。 @raga <<< - 喜欢它!!!比echo“矫枉过正”更优雅☺︎ 请记住,\$、双反斜杠和反斜杠反引号不会按字面意思用反引号处理,但它们会在 $(..) 内。根据您的用例,这可能是好是坏。 tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html 第 3.4.5 节。【参考方案5】:

我使用的是 Ubuntu 14.04,Bash 版本为 4.3.11。但是,我仍然没有内置字符串操作的乐趣$y,,

这是我在脚本中用来强制大写的:

CAPITALIZED=`echo "$y" | tr '[a-z]' '[A-Z]'`

【讨论】:

脚本顶部的 shebang 行是否指向旧版本的 bash? 不,我的系统上只安装了一个版本,所以它指向系统默认的 bash。 我认为[] 不是必需的:unix.stackexchange.com/questions/51983/… 如果您使用#!/bin/sh$y,, 将无法在 Ubuntu 中工作,因为默认 shell 是 Dash。你必须使用#!/bin/bash【参考方案6】:

如果您使用 declare (old: typeset) 定义变量,那么您可以在整个变量使用过程中说明值的大小写。

$ declare -u FOO=AbCxxx
$ echo $FOO
ABCXXX

"-l" 做 lc。

【讨论】:

不在 Bash 3.2 中【参考方案7】:

这对我有用。谢谢罗迪!

y="HELLO"
val=$(echo $y | tr '[:upper:]' '[:lower:]')
string="$val world"

一个小修改,如果你在变量旁边使用下划线你需要将变量名封装在中。

string="$val_world"

【讨论】:

以上是关于如何在 Bash 中将字符串从大写转换为小写? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我如何在 nginx Web 服务器的重写规则中将大写字母转换为小写字母?

如何在 Unicode 中将字符串设置为大写/小写?

使用递归在Python中将小写字母转换为大写字母

编写程序输入一个小写字母,如何将其转换为大写字母输出

python如何定义函数将小写转换为大写

python如何定义函数将小写转换为大写