抱歉,如果这是一个重复或基本的问题,但很难搜索™。我正在编写一个脚本来删除文件名中的奇怪字符。
商标符号怎么™
匹配[^a-z]
???
$ echo "AMD Ryzen™ 5 2600X Processor rstuv" |sed 's/[^A-Z]//g'
AMDRXP
$ echo "AMD Ryzen™ 5 2600X Processor rstuv" |sed 's/[^a-z]//g'
yzen™rocessorrstuv
$ echo "AMD Ryzen™ 5 2600X Processor rstuv" |sed 's/[^s-t]//g'
ssst
$ echo "AMD Ryzen™ 5 2600X Processor rstuv" |sed 's/[^t-u]//g'
™tu
™
似乎在t
和之间u
?
编辑:系统规格:
$ locale
LANG=en_CA.UTF-8
LANGUAGE=en_CA:en
LC_CTYPE="en_CA.UTF-8"
LC_NUMERIC="en_CA.UTF-8"
LC_TIME=en_CA.UTF-8
LC_COLLATE="en_CA.UTF-8"
LC_MONETARY="en_CA.UTF-8"
LC_MESSAGES="en_CA.UTF-8"
LC_PAPER="en_CA.UTF-8"
LC_NAME="en_CA.UTF-8"
LC_ADDRESS="en_CA.UTF-8"
LC_TELEPHONE="en_CA.UTF-8"
LC_MEASUREMENT="en_CA.UTF-8"
LC_IDENTIFICATION="en_CA.UTF-8"
LC_ALL=
$ lsb_release -sdc; uname -sri
Ubuntu 20.04.6 LTS
focal
Linux 5.4.0-172-generic x86_64
$ sed --version
sed (GNU sed) 4.7
这里是 Ubuntu 22.04 和
en_GB.UTF-8
区域设置:它肯定在
a
和之间排序z
,但话又说回来,也在和T
之间排序,并且现在,很少匹配。a
z
[a-z]
T
更令人惊讶的是,它匹配
[a-z]
但不匹配[A-Z]
。我不知道这是否是故意的,但可以通过/usr/share/i18n/locales/iso14651_t1_common
(源自https://standards.iso.org/iso-iec/14651/ed-4/ISO14651_2016_TABLE1_en.txt)解释<MNN><MNN>
为第三个权重(即携带相关字符的大小写信息的字符)而不是<CAP><CAP>
您需要将该字符视为CAP
其大小写的字符,或者不将其视为大写[[ ™ = [[:upper:]] ]]
(并且[[ ™ = [[:lower:]] ]]
对此很重要)的事实返回 false。我不知道
MNN
代表什么,但它似乎用于所有上标字符,其中有些是大写字母,有些是小写字母。在任何情况下,如果您想匹配
abcdefghijklmnopqrstuvwxyz
,请使用[abcdefghijklmnopqrstuvwxyz]
, not[a-z]
,它没有理由仅包含这 26 个字母,除非在上下文中(例如在 zsh glob 或 perl/PCRE/PCRE2 正则表达式中),其中范围基于代码点值(在大多数具有这 26 个字母的字符集中,它们是连续的并且按该顺序)。在相同的 Ubuntu 22.04 系统和相同的
en_GB.UTF-8
区域设置上,我发现[a-z]
范围匹配:GNU 中的字符
grep
,但请注意,它也匹配由多个字符组成的整理元素,例如:globasciirange
当该选项打开时(现在默认情况下),在 bash(GNU shell)的 glob 模式中。请注意,它包含除 ASCII 字符之外的大写字符。在 bash glob 中
globasciirange
关闭。请注意它还如何匹配 ASCII 的大写字符(Z 除外)。对于 bash 的
[[ $c =~ ^[a-z]$ ]]
. 其中的Same asgrep
和 Likegrep
也匹配多字符整理元素。在 zsh globs 中(基于代码点)。因为
[[ $c =~ '^[a-z]$' ]]
它给出与 bash 相同的结果,因为它使用相同的正则表达式库,除非rematchpcre
启用该选项,在这种情况下它给出的结果abcdefghijklmnopqrstuvwxyz
以及范围基于 PCRE 中的代码点。