Regular-Expression

為什麼大寫字母包含在 awk 正則表達式中的一系列小寫字母中?

  • December 30, 2019
$ echo ABC | awk '$0 ~ /^[a-b]/'
ABC
$ echo ABC | awk '$0 ~ /^[a-a]/'
$ echo ABC | awk '$0 ~ /^a/'
$ 

你看。/[a-b]/擷取A,但/[a-a]//a/不擷取。為什麼?

我認為這是一個“語言環境”問題。

在我的語言環境 it_IT 中,以下程式碼段

if [[ a < A ]]; then
 echo "a < A"
elif [[ a > A ]]; then
 echo "a > A"
else
 echo "a = A"
fi

if [[ b < A ]]; then
 echo "b < A"
elif [[ b > A ]]; then
 echo "b > A"
else
 echo "b = A"
fi

節目

a < A
b > A

所以這A(令人驚訝地)在a和之間b,所以在範圍內。

嘗試執行

echo ABC | LC_COLLATE=C awk '$0 ~ /^[a-b]/'

編輯

以下命令顯示您的語言環境中的整理順序:

echo $(LC_COLLATE=C printf '%s\n' {A..z} | sort)

我機器上的輸出是

` ^ _ [ ] a A b B c C d D e E f F g G h H i I j J k K l L m M n N o O p P q Q r R s S t T u U v V w W x X y Y z Z

(無法從 bash 的手冊頁中理解序列表達式是否以區域設置排序順序擴展;似乎不是)。

引用自:https://unix.stackexchange.com/questions/19322