Шукайте символи діакритики / наголосів за допомогою команди `locate`


8

Іноді мені потрібно шукати файли з наголошеними символами (діакритичні взагалі), як правило, з locate / mlocate. Я хочу налаштувати (можливо, в /etc/updatedb.conf), тому він дозволить мені шукати ці спеціальні символи за допомогою певного відображення мови, наприклад:

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

Тому locate -i liberaciónтакож шукайте файли з рядковим liberacion і навіть liberaciòn .

Примітки та припущення

  • А може бути , інші: àáâãäåæ ÇÈÉÊËÌÍÎÏ ÐÑÒÓÔÕÖØÙÚÛÜÝÞ ßàáâãäåæç èéêëìíîïðñòóôõö øùúûüýþÿ .
  • Це звичайна ситуація з такими романтичними мовами, як іспанська, французька та німецька.
  • Я завжди використовую локаль 100% UTF-8.
  • Я б швидше не повинен використовувати регулярні вирази.
  • Патч може використовувати транслітерацію ASCII Unicode як Unidecode / cUnidecode . Більшість молокатів написані на С.

Пов'язані

Відповіді:


3

Якщо ми подивимось updatedb.conf(5), ми побачимо, що з елементами конфігурації ми нічого не можемо зробити.

Отже, ми будемо писати сценарій, використовуючи locate; Врешті-решт ми можемо запустити щось подібне my-locate.sh liberacionабо my-locate.sh liberâciònце принесе нам всі можливі комбінації.


Давайте розпочнемо

Спочатку створіть простий файл як нашу базу даних де завгодно, наприклад ~/.mydb:; потім додайте символи наголосів у цей файл так:

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

Тоді нам потрібен невеликий сценарій, який виконує нам роботу, я написав простий:

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

Тепер збережіть його десь у вашому PATH з потрібним іменем, наприклад: in ~/bin. Це має бути вже у вашому середовищі PATH.

Адже просто використовуйте щось подібне для пошуку всіх можливих комбінацій.

my-locate.sh liberacion

Знайду для мене все це:

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

Ви можете використовувати grep -fабо fgrepуникати інтерпретації "$CH"як спеціального символу, наприклад grep ^, відповідатиме будь-якому рядку, але відповідає grep -f ^лише тим, що містять цей символ ^. Також може бути простіше використовувати класи символів для створення регулярного виразу, тобто REG="[$CHARS]", ймовірно, простіше, ніж ваша sedкоманда. Хоча слідкуйте за особливими персонажами! Інакше хороший підхід. +1
Девід Фоерстер

2

Тепер з mlocate 0.26 у Ubuntu 18.04+ ( -t --transliterateдив . Сторінку "man" ) (без необхідності дивних способів вирішення):

Створення деяких тестових файлів:

$ touch liberación liberacion liberaciôn

Оновлення та пошук:

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

Тож тепер locate -t liberaciónтакож шукайте файли з рядком liberacionі рівнимиliberaciòn !

Нарешті, створення псевдоніма на моєму .bashrc :-)

$ alias locate="locate --transliterate"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.