`locate` 명령으로 분음 부호 / 액센트 문자로 검색


8

때로는 액센트 문자 (일반적으로 분음 부호)가있는 파일 (일반적으로 찾기 / 이동)을 사용하여 파일을 검색해야합니다. /etc/updatedb.conf예를 들어 특정 언어 매핑을 사용 하여이 특수 문자를 검색 할 수 있도록 설정하고 싶습니다 ( ).

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

따라서 locate -i liberación문자열 liberacion 및 심지어 liberaciòn 파일도 검색 하십시오 .

참고 및 가정

  • 그리고 다른 사람 : ÂÃÄÀÁÅÆ ÇÈÉÊËÌÍÎÏ ÐÑÒÓÔÕÖØÙÚÛÜÝÞ ßàáâãäåæç èéêëìíîïðñòóôõö øùúûüýþÿ .
  • 이것은 스페인어, 프랑스어 및 독일어와 같은 로맨스 언어 에서 일반적인 상황입니다 .
  • 항상 로케일 100 % UTF-8을 사용하고 있습니다.
  • 오히려 정규 표현식을 사용할 필요가 없습니다.
  • 패치는 Unidecode / cUnidecode에서 와 같이 유니 코드의 ASCII 음역을 사용할 수 있습니다 . 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
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또한 문자열로 파일을 검색 liberacion도하고liberaciòn !

마지막으로 내 .bashrc에 별칭을 만듭니다 :-)

$ alias locate="locate --transliterate"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.