[英]What's the difference between [[:upper:]] and [:upper:] (bash)?
所以我在macOS High Sierra 10.13.6下使用bash 3.2.57(1)-release,我試圖編寫一個bash腳本,要求不區分大小寫。 我讀到使用tr "[:upper:]" "[:lower:]" <<< "$(echo AaBbCcDd)"
會將整個字符串轉換為小寫。 但是,我在其他地方讀過使用'[[:UPPER:]]'
和'[[:LOWER:]]'
代替。 這些似乎仍然有效,但是讓我感到奇怪的是,這兩者之間有什么區別嗎?
在正則表達式中, [[: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,您需要第三方分發,例如Brew。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.