web-dev-qa-db-ja.com

`locate`コマンドで発音区別符/アクセント記号を使用して検索する

時々、アクセント付き文字(一般的には発音区別符号)を使用して、通常はロケート/ mlocateでファイルを検索する必要があります。特定の言語マッピングを使用してこの特殊文字を検索できるようにセットアップする(おそらく/etc/updatedb.confで)したい:

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

したがって、locate -i liberaciónは、文字列liberacionおよび偶数liberaciònを持つファイルも検索します。

注意事項と前提

  • そして多分他:ÂÃÄÀÁÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãääåææçèéêëìíîïðñòóôõöøùúûüýþÿ
  • これは、スペイン語、フランス語、ドイツ語のような ロマンス言語 の一般的な状況です。
  • 私は常にロケール100%UTF-8を使用しています。
  • 正規表現を使用する必要はありません。
  • パッチは、 nidecode / cUnidecode と同様に、UnicodeのASCII音訳を使用する場合があります。 mlocateのほとんどはCで書かれています。

関連する

8
Pablo Bianchi

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

したがって、now locate -t liberaciónは、文字列liberacion、さらにはliberaciònを含むファイルも検索します!

最後に、.bashrcにエイリアスを作成します:-)

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

updatedb.conf(5)を見ると、構成アイテムでできることはあまりないことがわかります。

したがって、locate;を使用してスクリプトを作成します。最後にmy-locate.sh liberacionmy-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のどこかに保存します(例:~/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
3
Ravexina