使用`locate`命令搜索变音符号/重音符号


8

有时我需要搜索带有重音符号的文件(通常是变音符号),通常是使用locate / mlocate。我希望进行设置(也许在中/etc/updatedb.conf),这样我就可以使用某种语言映射来搜索这些特殊字符,例如:

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

因此,locate -i liberación还要搜索具有字符串liberacion甚至liberaciòn的文件

注释和假设

  • 也许还有其他人:ÁÃÀÀÁÆÇÈÉÊËÌËÎÐÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãääææçèéêëëííïï¯ðñòóôõöøùúûüýþÿ
  • 这是浪漫语言(如西班牙语,法语和德语)中的常见情况。
  • 我始终使用100%UTF-8语言环境。
  • 我宁愿不必使用正则表达式。
  • 补丁程序可能会像Unidecode / cUnidecode一样使用Unicode的ASCII音译。大部分mlocate是用C语言编写的。

有关

Answers:


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 -ffgrep避免将其解释"$CH"为特殊字符,例如,grep ^将匹配任何行,但grep -f ^仅匹配包含该字符的行^。使用字符类来编写正则表达式REG="[$CHARS]"也可能会更容易,即可能比您的sed命令更容易。不过要当心特殊字符!否则是个好方法。+1
David Foerster

2

现在,使用mlocate 0.26,我们可以在Ubuntu 18.04+上使用-t --transliterate选项(请参见手册页)(不需要奇怪的解决方法):

创建一些测试文件:

$ 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还要搜索带有string liberacion甚至甚至liberaciòn!的文件

最后,在我的.bashrc上创建别名:-)

$ alias locate="locate --transliterate"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.