Cerca con segni diacritici / accenti con il comando `Locate`


8

A volte ho bisogno di cercare file con caratteri accentati (diacritici in generale), di solito con Locate / Mlocate. Vorrei impostare (forse in /etc/updatedb.conf) in modo che mi permetta di cercare questi caratteri speciali utilizzando una determinata mappatura della lingua, ad esempio:

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

Quindi locate -i liberacióncerca anche i file con stringa liberacion e persino liberaciòn .

Note e ipotesi

  • E forse altri: Â ÄÀÁÅÆ ÇÈÉÊËÌÍÎÏ ÐÑÒÓÔÕÖØÙÚÛÜÝÞ ßàáâãäåæç èéêëìíîïðñòóôõö øùúûüýþÿ .
  • Questa è una situazione comune nelle lingue romanze come lo spagnolo, il francese e il tedesco.
  • Uso sempre una localizzazione 100% UTF-8.
  • Preferirei non usare espressioni regolari.
  • Una patch potrebbe usare traslitterazioni ASCII di Unicode come fa Unidecode / cUnidecode . La maggior parte di mlocate è scritta su C.

Relazionato

Risposte:


3

Se diamo un'occhiata updatedb.conf(5), scopriremo che non c'è molto che possiamo fare con gli elementi di configurazione.

Quindi scriveremo uno script usando locate; Alla fine siamo in grado di eseguire qualcosa del genere my-locate.sh liberaciono my-locate.sh liberâciòne ci porterà tutte le possibili combinazioni.


Iniziamo

Prima di tutto crea un semplice file come nostro database ovunque tu voglia, ad es .: ~/.mydb; quindi aggiungi i tuoi caratteri di accento in quel file in questo modo:

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

Quindi abbiamo bisogno di un piccolo copione che faccia il lavoro per noi, ne ho scritto uno semplice:

#!/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$"

Ora salvalo da qualche parte nel tuo PERCORSO con un nome desiderato, ad esempio: in ~/bin. Dovrebbe essere già nel tuo ambiente PATH.

Dopotutto usa semplicemente qualcosa del genere per cercare tutte le possibili combinazioni.

my-locate.sh liberacion

Troverà per me tutti questi:

~/lab/liberacion
~/lab/liberaciòn
~/lab/liberación
~/lab/liberâciòn
~/lab/liberäciòn
~/lab/libÈrâciòn

È possibile utilizzare grep -fo fgrepper evitare l'interpretazione di "$CH"come un carattere speciale, ad esempio grep ^corrisponderebbe a qualsiasi riga ma grep -f ^corrisponde solo a quelli che contengono il carattere ^. Può anche essere più facile usare le classi di caratteri per creare l'espressione regolare, cioè REG="[$CHARS]"è probabilmente più facile del tuo sedcomando. Fai attenzione ai personaggi speciali! Altrimenti un buon approccio. +1
David Foerster,

2

Ora con mlocate 0.26 abbiamo -t --transliterateun'opzione (vedi la pagina man ) su Ubuntu 18.04+ (senza la necessità di strane soluzioni alternative):

Creazione di alcuni file di test:

$ touch liberación liberacion liberaciôn

Aggiorna e cerca:

$ updatedb
$ locate --transliterate liberacion 
/home/pablo/liberacion
/home/pablo/liberación
/home/pablo/liberaciôn

Quindi ora locate -t liberacióncerca anche i file con stringa liberacione persinoliberaciòn !

Infine, creando un alias sul mio .bashrc :-)

$ alias locate="locate --transliterate"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.