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


8

アクセント付き文字(発音区別符号)を含むファイルを検索する必要がある場合があります。通常は、locate / mlocateを使用します。セットアップしたい(たぶん/etc/updatedb.conf)ので、特定の言語マッピングを使用して、この特殊文字を検索できるようにします。次に例を示します。

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

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

注意と仮定

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

関連した

回答:


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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.