Desculpe se esta é uma pergunta repetida ou básica, mas é difícil procurar um ™. Estou escrevendo um script para remover caracteres estranhos de nomes de arquivos.
Como é que o símbolo da marca ™
corresponde [^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
™
parece estar entre t
e u
?
Editar: Especificações do sistema:
$ 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
Aqui no Ubuntu 22.04 e
en_GB.UTF-8
localidade:Definitivamente classifica entre
a
ez
, masT
também classifica entrea
ez
e hoje em dia, é raro[a-z]
corresponder aT
.O fato de ser correspondido,
[a-z]
mas não,[A-Z]
é mais surpreendente. Não sei se é intencional, mas pode ser explicado por/usr/share/i18n/locales/iso14651_t1_common
(derivado de https://standards.iso.org/iso-iec/14651/ed-4/ISO14651_2016_TABLE1_en.txt ) ter<MNN><MNN>
como terceiro peso (que é aquele que carrega informações de maiúsculas e minúsculas para caracteres onde isso é relevante) em vez do<CAP><CAP>
qual você precisaria que esse caractere fosse considerado comoCAP
maiúscula, ou o fato de não ser considerado maiúsculo[[ ™ = [[:upper:]] ]]
(e[[ ™ = [[:lower:]] ]]
por isso importa) retorna falso.Não sei o que
MNN
significa, mas parece ser usado em todos os caracteres sobrescritos, alguns dos quais letras maiúsculas, alguns dos quais letras minúsculas.Em qualquer caso, se você quiser corresponder on
abcdefghijklmnopqrstuvwxyz
, use[abcdefghijklmnopqrstuvwxyz]
, not[a-z]
que não tem motivo para incluir apenas essas 26 letras, exceto em contextos (como em zsh globs ou regexps perl/PCRE/PCRE2) onde o intervalo é baseado no valor do ponto de código (na maioria dos conjuntos de caracteres que possuem essas 26 letras, elas são contíguas e nessa ordem).No mesmo sistema Ubuntu 22.04 e na mesma
en_GB.UTF-8
localidade, acho que o[a-z]
intervalo corresponde a:caracteres no GNU
grep
, mas observe que ele também corresponde ao agrupamento de elementos feitos de mais de um caractere, como:nos padrões glob do bash (o shell GNU) quando a
globasciirange
opção está ativada (como agora é por padrão). Observe que inclui caracteres maiúsculos, exceto os ASCII.em bash globs com
globasciirange
desligado. Observe como também corresponde a caracteres maiúsculos de ASCII (exceto Z).para bash
[[ $c =~ ^[a-z]$ ]]
. Igual agrep
e semelhantegrep
também corresponde a elementos de agrupamento de vários caracteres.em zsh globs (com base no codepoint). Pois
[[ $c =~ '^[a-z]$' ]]
dá o mesmo resultado que o bash, pois usa a mesma biblioteca regexp, exceto quando arematchpcre
opção está habilitada, caso em que dá,abcdefghijklmnopqrstuvwxyz
assim como os intervalos são baseados no ponto de código no PCRE.