Como alguém usaria sed
ou outra ferramenta para remover todos os caracteres, exceto um intervalo multibyte específico?
Por exemplo, o intervalo \xd8\xa0 - \xd9\x8a
abrange caracteres arábicos codificados em UTF-8. Esta foi minha tentativa ingênua e esperançosa de usar o sed:
$ echo "Peace be upon you. السلام عليكم. שלום עליכם. Paz sobre vosotros." | sed -n -e 's|[^\xd8\xa0-\xd9\x8a]||p'
sed: -e expression #1, char 25: Invalid range end
Tinha sed
entendido caracteres multibyte, que deveriam ter nos deixado com a string:
السلام عليكم
Eu considerei usar iconv
para converter para alguma codificação específica do árabe, use sed
e converta novamente. No entanto, o trabalho que estou fazendo não é trivial, como eu poderia querer preservar tanto o árabe quanto o hebraico, então gostaria de manter tudo em UTF-8 o tempo todo, se possível.
Se sed
não puder trabalhar com caracteres multibyte, o que devo usar? Eu procurei por ambos sed
e perl
soluções sem sorte.
Observe que tentei adicionar uma UTF-8
tag à pergunta, mas o unix.SE altera isso para uma Unicode
tag. Não há Unicode aqui, são strings codificadas armazenadas no disco. Eu acho que deveria haver uma UTF-8
etiqueta separada.
Você pode usar propriedades Unicode em Perl:
-CIO
diz ao Perl que a entrada e a saída são codificadas em UTF-8.\P{...}
é uma correspondência de propriedade negativa,\p{...}
seria positiva.Usando Raku (anteriormente conhecido como Perl_6)
Entrada de amostra (texto do OP salvo como um arquivo de uma linha):
Extraia o script árabe:
Extraia o script hebraico:
Extraia o script latino:
Raku fornece suporte de alto nível para Unicode, e seu mecanismo Regex cresceu para ser um "analisador gramatical" capaz. Veja os links abaixo. Observe que o código acima retornará linhas em branco se não houver correspondência. Se você deseja apenas elementos/linhas correspondentes, basta adicionar uma chamada condicional à variável de correspondência
$/
(ou ):$<>
Por fim, você pode pesquisar a negação de uma propriedade Unicode interpondo um
!
caractere. Você também pode adicionar (ou até subtrair) da(s) classe(s) de caracteres desejada(s) com+
e/ou-
. [Observe o átomo regex adicional:Z
(espaço em branco) abaixo. No interesse da completude, o código abaixo mostra os parâmetros+
e - embora a possa funcionar na prática]:!
-
https://docs.raku.org/language/unicode
https://docs.raku.org/language/unicode#index-entry-UTF-8_Clean-8
https://stackoverflow.com/a/66540269/7270649