所以我在macOS High Sierra 10.13.6下使用bash 3.2.57(1)-release,我试图编写一个bash脚本,要求不区分大小写。我读到,使用tr "[:upper:]" "[:lower:]" <<< "$(echo AaBbCcDd)"
会将整个字符串转换为小写字母,确实如此。但是,我在其他地方阅读过使用'[[:UPPER:]]'
和'[[:LOWER:]]'
来代替。这些似乎仍然有效,但是让我感到奇怪的是,这两者之间有什么区别吗?
答案 0 :(得分:3)
在正则表达式中,[[:upper:]]
表示“任何大写字母”。但这是更通用机制的一个实例。外括号[…]
和内括号冒号[:…:]
具有不同的含义。外括号包围一个字符集。在字符集中,您可以使用方括号语法使用单个字符,范围2-9
和字符类。例如,正则表达式[2-9_[:upper:]]
匹配2到9之间的任何大写字母,下划线或数字。
tr
替换单个字符,而不是正则表达式。 (还有另一种替换正则表达式的工具:sed。)其参数是字符集,即放在括号内的字符。
tr '2-9_[:upper:]' 'X'
等同于
sed 's/[2-9_[:upper:]]/X/g'
您可以编写类似tr '[[:upper:]]' '[[:lower:]]'
的文字,并且其效果与tr '[:upper:]' '[:lower:]'
相同。但这不是因为外括号有任何特殊含义。这是因为您要用[
替换[
,用相应的小写字母替换大写字母,并用]
替换]
。单独更换支架无效。
(顺便说一句,bash 4具有内置的大小写转换机制:all_uppercase=${var^^}; all_lowercase=${var,,}
。但这在bash 3中不存在,这是Apple在macOS上提供的。要获得bash 4,您需要d需要第三方分发,例如Brew。)