$ echo ABC | awk '$0 ~ /^[a-b]/'
ABC
$ echo ABC | awk '$0 ~ /^[a-a]/'
$ echo ABC | awk '$0 ~ /^a/'
$
你看。/[a-b]/
捕获A
,但/[a-a]/
或/a/
不捕获。为什么?
答案1
我认为这是一个“区域设置”问题。
在我的区域设置 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 的手册页中理解 if序列表达式是否按语言环境整理顺序扩展;看来不是)。