Corresponde apenas letras ASCII na expressão regular, ignorando os trema

0

Eu uso um regex no meu script bash como

REGEX="^[a-zA-Z0-9\-]+$"

Eu quero filtrar todas as palavras não padrão, especialmente aquelas que contêm caracteres especiais em alemão äöüÄÖÜß

mas de acordo com este manual se você definir seu LOCALE como alemão, o regex a-z também contians ö

Como posso resolver isso?

Já tentei definir minhas localidades no início do script para inglês com:

#!/bin/bash
LANG=en_US.utf8
LANGUAGE=en_US.utf8
LC_ALL=en_US.utf8
export LANG
export LANGUAGE
export LC_ALL

mas sem efeito.

Eu não quero fazer essa solução alternativa e substituir os caracteres especiais de antemão:

tr _ -|tr . -|tr " " -|tr '[:upper:]' '[:lower:]'|sed 's/ä/ae/;s/ö/oe/;s/ü/ue/;s/ß/ss/g')

Eu preferiria aprender a maneira correta.

    
por rubo77 05.09.2017 / 13:05

1 resposta

2

Uso:

REGEXP='^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0-9-]+$'

Para selecionar quais caracteres você deseja. O que é correspondido por [a-z] só é garantido como [abcdefghijkmnopqrstuvwxyz] no código do idioma C / POSIX.

(suponho que você não queira que a barra invertida seja incluída, mas que \ foi uma tentativa equivocada de escapar do - ).

Outra opção é corrigir a localidade para C antes de usar a ferramenta que avalia que ^[a-zA-Z0-9-]+$ estendido regexp (ou ^[[:alnum:]-]+$ ), como:

LC_ALL=C grep -Ee "$REGEXP"

Isso é válido neste caso, mas não em casos como REGEXP='[A-Z]' no caso de os dados para corresponderem ao regexp estarem em um conjunto de caracteres como BIG5-HKSCS ou GB18030 (e em locais que usam esse mesmo caractere) onde muitos caracteres codificações que contêm a mesma codificação que as de A-Z .

Exemplo em que [A-Z] corresponde a Á (U + 00C1, codificado como 0x88 0x57 em BIG5-HKSCS (em que 0x57 também é W )):

$ LC_ALL=zh_HK.big5hkscs REGEXP='[A-Z]' bash -c 'printf "\uc1\n" |
    LC_ALL=C grep -qe "$REGEXP" && echo match'
match
    
por 05.09.2017 / 13:09