lee*_*oon 4 regex bash shell tr
因此,我在 macOS High Sierra 10.13.6 下使用 bash 3.2.57(1)-release,并尝试编写一个需要不区分大小写输入的 bash 脚本。我读到 usingtr "[:upper:]" "[:lower:]" <<< "$(echo AaBbCcDd)"会将整个字符串转换为小写,它确实如此。不过,我在其他地方读到过使用'[[:UPPER:]]'and'[[:LOWER:]]'代替。这些似乎仍然有效,但这让我想知道,这两者之间有什么区别吗?
在正则表达式中,[[:upper:]]表示\xe2\x80\x9cany大写字母\xe2\x80\x9d。但这是更通用机制的一个例子。外括号[\xe2\x80\xa6]和内括号冒号[:\xe2\x80\xa6:]具有不同的含义。外括号包围一个字符集。在字符集中,您可以使用单个字符、范围(例如2-9)以及使用括号冒号语法的字符类。例如,正则表达式[2-9_[:upper:]]匹配 2 到 9 之间的任何大写字母、下划线或数字。
tr替换单个字符,而不是正则表达式。(还有另一个工具可以替换正则表达式:sed。)它的参数是字符集,即您要放在括号内的内容。
tr '2-9_[:upper:]' 'X'\nRun Code Online (Sandbox Code Playgroud)\n\n相当于
\n\nsed 's/[2-9_[:upper:]]/X/g'\nRun Code Online (Sandbox Code Playgroud)\n\n你可以写类似的东西tr '[[:upper:]]' '[[:lower:]]',它的效果与 相同tr '[:upper:]' '[:lower:]'。但这并不是因为外括号有任何特殊含义。这是因为您要将 、 大写字母替换[为[相应的小写字母,然后]将]。单独替换括号没有效果。
(顺便说一句,bash 4有一个内置的大小写转换机制:all_uppercase=${var^^}; all_lowercase=${var,,}。但这在 bash 3 中不存在,这是 Apple 在 macOS 上提供的。要获得 bash 4,您需要第三方发行版,例如作为布鲁。)