ค้นหาด้วยอักขระกำกับ / เน้นเสียงด้วยคำสั่ง `ค้นหา '


8

บางครั้งฉันต้องการค้นหาไฟล์ที่มีอักขระเน้นเสียง (กำกับโดยทั่วไป) โดยปกติแล้วจะมีการค้นหา / mlocate ฉันต้องการตั้งค่า (อาจเป็น/etc/updatedb.conf) ดังนั้นให้ฉันค้นหาอักขระพิเศษนี้โดยใช้การจับคู่ภาษาที่แน่นอนตัวอย่างเช่น:

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

ดังนั้นlocate -i liberaciónยังค้นหาไฟล์ที่มีสตริงLiberacionและแม้กระทั่งLiberación

หมายเหตุและข้อสมมติฐาน

  • และบางทีคนอื่น ๆ : ÂÃÄÀÁÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ
  • นี่เป็นสถานการณ์ทั่วไปของภาษาโรแมนติกเช่นสเปนฝรั่งเศสและเยอรมัน
  • ฉันใช้ locale 100% UTF-8 เสมอ
  • ฉันไม่ต้องการใช้นิพจน์ทั่วไป
  • แพทช์อาจจะใช้ทับศัพท์ ASCII ของ Unicode เป็น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$"

~/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
David Foerster

2

ขณะนี้มี mlocate 0.26 เรามี-t --transliterateตัวเลือก (ดูman page ) บน 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 !

ในที่สุดการสร้างชื่อแทนใน. bashrc ของฉัน :-)

$ alias locate="locate --transliterate"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.