请考虑以下sed regex替换:
$ echo 'oóO' | sed -e 's/[^a-z]/./g'
oó.
对我来说,这是“用a
替换不在z
到.
范围内的所有字符,所以我期望输出o..
,因为两者都不ó或O在任何编码方式(FWIW,我使用的是UTF-8)中都在“代码点”意义上的a-z
范围内。
这是怎么回事?
如何创建一个仅与[abcdefhijklmnopqrstuvwxyz]
完全匹配而不将其全部写出的范围?
这是我系统上locale
的输出:
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_US.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=en_US.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=
答案 0 :(得分:2)
根据Quasímodo对suggestion的修改,为LC_COLLATE=C
命令设置sed
可以起作用:
$ echo 'oóO' | LC_COLLATE=C sed -e 's/[^a-z]/./g'
o..
关键是将归类顺序更改为“ C”,以便ó不再以排序(归类)顺序出现在o和p之间,但是不更改{{1} }(或LC_CTYPE
),以便仍能正确解释多字节UTF-8字符(这就是LC_ALL
不起作用的原因。)