Tìm kiếm với các ký tự dấu / dấu trọng âm bằng lệnh `location`


8

Đôi khi tôi cần tìm kiếm các tệp có ký tự có dấu (nói chung là dấu phụ), thường là với định vị / mlocate. Tôi muốn thiết lập (có thể trong /etc/updatedb.conf) để nó cho phép tôi tìm kiếm các ký tự đặc biệt này bằng cách sử dụng ánh xạ ngôn ngữ nhất định, ví dụ:

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

Vì vậy, locate -i liberacióncũng tìm kiếm các tập tin với chuỗi tự do và thậm chí cả Liberaciòn .

Ghi chú và giả định

  • Và có lẽ những người khác: ÂÃÄÀÁÅÆ ÇÈÉÊËÌÍÎÏ ÐÑÒÓÔÕÖØÙÚÛÜÝÞ ßàáâãäåæç èéêëìíîïðñòóôõö øùúûüýþÿ .
  • Đây là một tình huống phổ biến trên các ngôn ngữ lãng mạn như Tây Ban Nha, Pháp và Đức.
  • Tôi luôn sử dụng ngôn ngữ 100% UTF-8.
  • Tôi thà không phải sử dụng các biểu thức thông thường.
  • Một bản vá có thể sử dụng phiên âm ASCII của Unicode như Unidecode / cUnidecode . Hầu hết các mlocate được viết trên C.

Liên quan

Câu trả lời:


3

Nếu chúng ta xem xét updatedb.conf(5), chúng ta sẽ thấy rằng chúng ta không thể làm gì nhiều với các mục cấu hình.

Vì vậy, chúng tôi sẽ viết một kịch bản bằng cách sử dụng locate; Cuối cùng, chúng tôi có thể chạy một cái gì đó như my-locate.sh liberacionhoặc my-locate.sh liberâciònnó sẽ mang lại cho chúng tôi tất cả các kết hợp có thể.


Hãy bắt đầu

Trước tiên hãy tạo một tệp đơn giản như cơ sở dữ liệu của chúng tôi ở bất cứ đâu bạn muốn, ví dụ : ~/.mydb; sau đó thêm các ký tự dấu của bạn vào tệp đó như thế này:

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

Sau đó, chúng tôi cần một kịch bản nhỏ thực hiện công việc cho chúng tôi, tôi đã viết một kịch bản đơn giản:

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

Bây giờ hãy lưu nó ở đâu đó trong PATH của bạn với một tên mong muốn, ví dụ: in ~/bin. Nó đã có sẵn trong môi trường PATH của bạn.

Sau khi tất cả chỉ cần sử dụng một cái gì đó như thế này để tìm kiếm tất cả các kết hợp có thể.

my-locate.sh liberacion

Sẽ tìm cho tôi tất cả những điều này:

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

Bạn có thể sử dụng grep -fhoặc fgrepđể tránh việc giải thích "$CH"như một ký tự đặc biệt, ví dụ như grep ^sẽ khớp với bất kỳ dòng nào nhưng grep -f ^chỉ khớp với các ký tự có chứa ký tự đó ^. Cũng có thể dễ dàng hơn khi sử dụng các lớp ký tự để tạo biểu thức chính quy, nghĩa REG="[$CHARS]"là có thể dễ hơn sedlệnh của bạn . Xem ra cho các nhân vật đặc biệt mặc dù! Nếu không thì một cách tiếp cận tốt. +1
David Foerster

2

Bây giờ với mlocate 0.26, chúng ta có -t --transliteratetùy chọn (xem trang hướng dẫn ) trên Ubuntu 18.04+ (không cần giải pháp thay thế lẻ):

Tạo một số tệp thử nghiệm:

$ touch liberación liberacion liberaciôn

Cập nhật và tìm kiếm:

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

Vì vậy, bây giờ locate -t liberacióncũng tìm kiếm các tập tin với chuỗi liberacionvà thậm chíliberaciòn !

Cuối cùng, tạo bí danh trên .bashrc của tôi :-)

$ alias locate="locate --transliterate"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.