Suchen Sie mit diakritischen Zeichen / Akzentzeichen mit dem Befehl `locate`

8

Manchmal muss ich Dateien mit Akzentzeichen (im Allgemeinen diakritisch) durchsuchen, normalerweise mit find / mlocate. Ich möchte (möglicherweise in /etc/updatedb.conf) einrichten, damit ich mit einer bestimmten Sprachzuordnung nach diesen Sonderzeichen suchen kann, zum Beispiel:

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

locate -i liberaciónSuchen Sie also auch nach Dateien mit String Liberacion und sogar Liberaciòn .

Anmerkungen und Annahmen

  • Und vielleicht andere: ÂÃÄÀÁÅÆ ÇÈÉÊËÌÍÎÏ ÐÑÒÓÔÕÖØÙÚÛÜÝÞ ßàáâãäåæç èéêëìíîïðñòóôõö øùúûüýþÿ .
  • Dies ist eine häufige Situation bei romanischen Sprachen wie Spanisch, Französisch und Deutsch.
  • Ich verwende immer ein Gebietsschema 100% UTF-8.
  • Ich würde lieber keine regulären Ausdrücke verwenden müssen.
  • Ein Patch verwendet möglicherweise ASCII-Transliterationen von Unicode wie Unidecode / cUnidecode . Der größte Teil von mlocate ist auf C geschrieben.

verbunden

Pablo Bianchi
quelle

Antworten:

3

Wenn wir uns das ansehen updatedb.conf(5), werden wir feststellen, dass wir mit Konfigurationselementen nicht viel anfangen können.

Also werden wir ein Skript schreiben mit locate; Am Ende können wir so etwas wie my-locate.sh liberacionoder ausführen my-locate.sh liberâciònund es bringt uns alle möglichen Kombinationen.


Lasst uns beginnen

Erstellen Sie zunächst eine einfache Datei als unsere Datenbank, wo immer Sie möchten, z. B.: ~/.mydb; Fügen Sie dann Ihre Akzentzeichen wie folgt in diese Datei ein:

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

Dann brauchen wir ein kleines Skript, das die Arbeit für uns erledigt. Ich habe ein einfaches geschrieben:

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

Speichern Sie es jetzt irgendwo in Ihrem PFAD mit einem gewünschten Namen, z ~/bin. B.: In . Es sollte sich bereits in Ihrer PATH-Umgebung befinden.

Verwenden Sie einfach so etwas, um alle möglichen Kombinationen zu suchen.

my-locate.sh liberacion

Wird für mich all dies finden:

~/lab/liberacion
~/lab/liberaciòn
~/lab/liberación
~/lab/liberâciòn
~/lab/liberäciòn
~/lab/libÈrâciòn
Ravexina
quelle
Sie können die Interpretation als Sonderzeichen verwenden grep -foder fgrepvermeiden "$CH", z. B. grep ^würde jede Zeile übereinstimmen, aber grep -f ^nur diejenigen, die das Zeichen enthalten ^. Es kann auch einfacher sein, Zeichenklassen zum Erstellen des regulären Ausdrucks zu verwenden, dh REG="[$CHARS]"wahrscheinlich einfacher als Ihr sedBefehl. Achten Sie jedoch auf Sonderzeichen! Ansonsten ein guter Ansatz. +1
David Foerster
2

Jetzt mit mlocate 0.26 haben wir die -t --transliterateOption (siehe Manpage ) unter Ubuntu 18.04+ (ohne die Notwendigkeit ungerader Problemumgehungen):

Erstellen einiger Testdateien:

$ touch liberación liberacion liberaciôn

Update und Suche:

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

Also jetzt locate -t liberaciónauch nach Dateien mit String liberacionund sogar suchenliberaciòn !

Zum Schluss erstelle ich einen Alias ​​auf meiner .bashrc :-)

$ alias locate="locate --transliterate"
Pablo Bianchi
quelle