No Linux, eu tenho um diretório com muitos arquivos. Alguns deles têm caracteres não ASCII, mas todos são UTF-8 válidos . Um programa possui um bug que o impede de trabalhar com nomes de arquivos não ASCII, e eu tenho que descobrir quantos são afetados. Eu faria isso com find
e depois faria um grep para imprimir os caracteres não ASCII e, em seguida, faria um wc -l
para encontrar o número. Não precisa ser grep; Posso usar qualquer expressão regular padrão do Unix , como Perl , sed , AWK , etc.
No entanto, existe uma expressão regular para 'qualquer caractere que não seja um caractere ASCII'?
/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]
Respostas:
Isso corresponderá a um único caractere não ASCII:
Este é um PCRE ( Expressão Regular Compatível com Perl) válido .
Você também pode usar as teclas abreviadas do POSIX :
[[:ascii:]]
- corresponde a um único caractere ASCII[^[:ascii:]]
- corresponde a um único caractere não ASCII[^[:print:]]
provavelmente será suficiente para você. **fonte
^
é válido no PCRE.:print:
que não funciona em um terminal UTF8? Isso funciona para mim em um terminal UTF8:27.chr =~ /[^[:print:]]/
rename 's/[^\x00-\x7F]//g' *
(você pode usar-n
para verificar se os nomes mudam primeiro).Não,
[^\x20-\x7E]
não é ASCII.Isso é real ASCII:
Caso contrário, ele cortará novas linhas e outros caracteres especiais que fazem parte da tabela ASCII!
fonte
Você também pode verificar esta página: Expressões regulares Unicode , pois contém algumas classes úteis de caracteres Unicode, como:
fonte
[^\x00-\x7F]
e[^[:ascii:]]
perca alguns bytes de controle para que as strings possam ser a melhor opção às vezes. Por exemplocat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g'
, fará coisas estranhas ao seu terminal, ondestrings test.torrent
se comportará.fonte
Para validar a caixa de texto, aceite ascii Use apenas este padrão
[\x00-\x7F]+
fonte
Eu uso
[^\t\r\n\x20-\x7E]+
e isso parece estar funcionando bem.fonte
Você pode usar este regex:
Caso pergunte, as opções são Multiline .
fonte
Você realmente não precisa de uma regex.
Isso também mostrará nomes de arquivos com caracteres de controle em seus nomes, mas considero isso um recurso.
Se você não tiver nenhum arquivo correspondente, o glob se expandirá para si mesmo, a menos que você tenha
nullglob
definido. (A expressão não corresponde a si mesma; portanto, tecnicamente, essa saída é inequívoca.)fonte
Isso acabou sendo muito flexível e extensível. $ field = ~ s / [^ \ x00- \ x7F] // g; # portanto, todos os itens não ASCII ou específicos em questão podem ser limpos. Muito bom na seleção ou no pré-processamento de itens que eventualmente se tornarão chaves de hash.
fonte