正则表达式匹配sed中的非ASCII字符

时间:2020-04-20 18:11:20

标签: regex sed

请考虑以下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=

1 个答案:

答案 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不起作用的原因。)