为什么大写字母包含在awk正则表达式中的小写字母范围内?

Modified on: Sat, 30 Jun 2018 07:25:30 +0800
$ echo ABC | awk '$0 ~ /^[a-b]/'
ABC
$ echo ABC | awk '$0 ~ /^[a-a]/'
$ echo ABC | awk '$0 ~ /^a/'
$ 

你知道吗? /[a-b]/捕获A,但/[a-a]//a/不捕获。为什么呢?

作者:mattdm,Cheng

最佳答案

我认为这是一个“语言环境”问题。

在我的语言环境中,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(令人惊讶地)在ab之间,所以在范围内。

尝试执行

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的手册页中理解;似乎没有。)

作者:,enzotib

相关问答

添加新评论