Procura com caracteres diacríticos / acentos com o comando 'locate'

7

Às vezes, preciso pesquisar arquivos com caracteres acentuados (diacríticos em geral), geralmente com locate / mlocate. Desejo configurar (talvez em /etc/updatedb.conf ), então deixe-me procurar por esses caracteres especiais usando um determinado mapeamento de idioma, por exemplo:

a == âàáäÂÀÂÄ
e == êèéëÊÈÉË
i == îïíÎÏ
o == ôöóÔÖ
u == ûùüÛÜÙ
c == çÇ
n == ñ

Então locate -i liberación também procura por arquivos com string liberacion e até liberación .

Notas e suposições

  • E talvez outros: ÂÃÆ'¯¯¿½Ã¯Â¿Â½Ã¯Â½Ã¯Â½Ã¯ÂÂNCIA
  • Esta pode ser uma situação bastante comum, especialmente para falantes de espanhol, francês e alemão.
  • Estou sempre usando uma localidade 100% UTF-8.
  • Eu preferiria não usar expressões regulares.
  • Um patch pode usar transliterações ASCII do Unicode como Unidecode / cUnidecode faz. A maior parte do mlocate é escrita em C

Relacionado

por Pablo Bianchi 25.04.2017 / 21:06

1 resposta

3

Se dermos uma olhada em updatedb.conf(5) , descobriremos que não há muito que possamos fazer com itens de configuração.

Então, vamos escrever um script usando locate ; No final, podemos executar algo como my-locate.sh liberacion ou my-locate.sh liberâciòn e isso nos traz todas as combinações possíveis.

Vamos começar

Primeiro, crie um arquivo simples como nosso banco de dados em qualquer lugar que você queira, por exemplo: ~/.mydb ; em seguida, adicione seus caracteres de acentuação nesse arquivo assim:

aâàáäÂÀÂÄ
eêèéëÊÈÉË
iîïíÎÏ
uûùüÛÜÙ
cçÇ
oôöóÔÖóòòò
...
...

Então, precisamos de um pequeno script que faça o trabalho por nós, escrevi um simples:

#!/bin/bash

# Final search term 
STR=""

# Loop throughout all characters of desired string
for (( i=0; i<${#1}; i++ )); do

  # Split the string in one char
  CH="${1:$i:1}"

  # Find all possible combinations of this char
  CHARS=$(grep "$CH" ~/.mydb)

  # Add an "or" operator between characters
  REG=$(echo "$CHARS" |  sed 's/.\{1\}/&\|/g' )
  REG="($REG)"

  # Append all possible combination of this character
  # to our final search term as an or statement
  if [ "$REG" == '()' ];
  then
   STR=$STR$CH
  else
   STR=$STR$REG
  fi

done

# locate it using regex
locate --regex "$STR$"

Agora salve-o em algum lugar em seu PATH com um nome desejado, por exemplo: em ~/bin . Já deve estar no seu ambiente PATH.

Afinal, basta usar algo assim para pesquisar todas as combinações possíveis.

my-locate.sh liberacion

Encontrar-me-ei tudo isto:

~/lab/liberacion
~/lab/liberaciòn
~/lab/liberación
~/lab/liberâciòn
~/lab/liberäciòn
~/lab/libÈrâciòn
    
por Ravexina 26.04.2017 / 17:28