Cari dengan karakter diakritik / aksen dengan perintah `loc`

8

Kadang-kadang saya perlu mencari file dengan karakter beraksen (diakritik secara umum), biasanya dengan loc / mlocate. Saya ingin mengatur (mungkin dalam /etc/updatedb.conf) sehingga saya dapat mencari karakter khusus ini menggunakan pemetaan bahasa tertentu, misalnya:

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

Begitu locate -i liberaciónjuga mencari file dengan string liberacion dan bahkan liberaciòn .

Catatan dan asumsi

  • Dan mungkin yang lainnya: ÃÄÀÁÅÆ ÇÈÉÊËÌÍÎÏ ÐÑÒÓÔÕÖØÙÚÛÜÝÞ ßàáâãäåæç èéêëìíîïðñòóôõö øùúûüýþÿ .
  • Ini adalah situasi umum pada bahasa romansa seperti Spanyol, Prancis dan Jerman.
  • Saya selalu menggunakan lokal 100% UTF-8.
  • Saya lebih suka tidak harus menggunakan ekspresi reguler.
  • Suatu tambalan mungkin menggunakan transliterasi ASCII dari Unicode seperti halnya Unidecode / cUnidecode . Sebagian besar mlocate ditulis dalam C.

Terkait

Pablo Bianchi
sumber

Jawaban:

3

Jika kita melihat updatedb.conf(5), kita akan menemukan bahwa tidak banyak yang dapat kita lakukan dengan item konfigurasi.

Jadi kita akan menulis skrip menggunakan locate; Pada akhirnya kita dapat menjalankan sesuatu seperti my-locate.sh liberacionatau my-locate.sh liberâciòndan itu akan membawa kita semua kemungkinan kombinasi.


Ayo mulai

Pertama, buat file sederhana sebagai basis data kami di mana pun Anda inginkan, misalnya ~/.mydb:; kemudian tambahkan aksen karakter Anda ke file itu seperti ini:

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

Maka kita perlu sebuah skrip kecil yang melakukan pekerjaan untuk kita, saya menulis yang sederhana:

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

Sekarang simpan di suatu tempat di PATH Anda dengan nama yang diinginkan, misalnya: di ~/bin. Itu harus sudah ada di lingkungan PATH Anda.

Setelah semua cukup gunakan sesuatu seperti ini untuk mencari semua kemungkinan kombinasi.

my-locate.sh liberacion

Akan menemukan untuk saya semua ini:

~/lab/liberacion
~/lab/liberaciòn
~/lab/liberación
~/lab/liberâciòn
~/lab/liberäciòn
~/lab/libÈrâciòn
Ravexina
sumber
Anda dapat menggunakan grep -fatau fgrepuntuk menghindari interpretasi "$CH"sebagai karakter khusus, mis. grep ^Akan cocok dengan baris apa pun tetapi grep -f ^hanya cocok dengan yang mengandung karakter ^. Mungkin juga lebih mudah menggunakan kelas karakter untuk membuat ekspresi reguler, yaitu REG="[$CHARS]"mungkin lebih mudah daripada sedperintah Anda . Hati-hati dengan karakter khusus! Kalau tidak, pendekatan yang baik. +1
David Foerster
2

Sekarang dengan mlocate 0.26 kami memiliki -t --transliterateopsi (lihat halaman manual ) di Ubuntu 18.04+ (tanpa perlu solusi yang aneh):

Membuat beberapa file uji:

$ touch liberación liberacion liberaciôn

Perbarui dan cari:

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

Jadi sekarang locate -t liberaciónjuga cari file dengan string liberaciondan bahkanliberaciòn !

Akhirnya, membuat alias di .bashrc saya :-)

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