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

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

有时我需要搜索带有重音字符(一般是变音符号)的文件,通常使用locate(mlocate风格,合并定位;请参阅下面与 plocate 相关的警告)。我希望进行设置(可能在/etc/updatedb.conf),以便它允许我使用某种语言映射搜索这些特殊字符,例如:

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

因此locate -i liberación也应该搜索带有字符串的文件名解放报乃至解放

注释和假设

  • 也许还有其他:ÂÃÄÀÁÅÆ ÇÈÉÊËÌÍÎÏ ÐÑÒÓÔÕÖØÙÚÛÜÝÞ ßàáâäåç èéêëìíîïðñòóôõö øùúûüýþÿ
  • 这是罗曼语例如西班牙语、法语和德语。
  • 我总是使用 100% UTF-8 语言环境。
  • 我宁愿不使用正则表达式。
  • 补丁可能会使用 Unicode 的 ASCII 音译作为统一编码/统一编码确实如此。mlocate 的大部分代码都是用 C 编写的。

有关的

答案1

如果我们看一下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 中的某个位置,例如:~/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

答案2

移动定位

现在移动定位0.26 我们有-t --transliterate选择(见手册页)在 Ubuntu 18.04+ 上(无需解决方法):

创建一些测试文件:

$ 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

最后,创建一个别名...:-)

$ alias locate="locate --transliterate"

定位

定位:是更快定位较小的指数但没有--transliterate选择,并且短期内也不会有,正如其唯一维护者 (Steinar Gunderson) 所说:

不幸的是,这非常不简单。mlocate 可以避免这种情况,因为它会线性扫描每个文件名;而 plocate 则不能,这就是为什么它比 mlocate 快得多,但也使这种依赖于语言环境的搜索变得更加困难。所以不幸的是,这种情况不太可能很快发生。

我找不到与该项目相关的问题跟踪器。

但它有--regex,所以内部似乎可以使用类似的东西Ravexina 的方法

plocate默认情况下,我在发行版中将其删除,安装了 mlocate 并保留它,以便不会被 plocate 替换:

sudo apt update && sudo apt upgrade
wget "http://archive.ubuntu.com/ubuntu/pool/main/m/mlocate/mlocate_0.26-3ubuntu3_amd64.deb"
sudo apt install -f
sudo apt-mark hold mlocate

相关内容