Поиск с символами диакритики / акцентов с командой `locate`

Иногда мне нужно искать файлы с акцентированными символами (обычно диакритические), обычно с помощью locate / mlocate. Я хочу настроить (возможно, в /etc/updatedb.conf), поэтому он позволяет мне искать специальные символы с использованием определенного языкового сопоставления, например:

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

Так locate -i liberación также искать файлы со строкой liberacion и даже свобода.

Примечания и предположения

И, возможно, другие: ÂÃÄÁÁÅÆ ÇÈÉÊËÌÍÎÏ ÐÑÒÓÔÕÖØÙÚÛÜÞÞ ßàáâãææç èéêëìíîïðñòóôõö øùúûüýþÿ. Это может быть довольно распространенная ситуация, особенно для испанских, французских и немецких ораторов. Я всегда использую локаль 100% UTF-8. Я бы предпочел не использовать регулярные выражения. Патч может использовать транслитерации ASCII Unicode, как это делает Unidecode / cUnidecode. Большая часть mlocate написана на C.

Связанный

И, возможно, другие: ÂÃÄÁÁÅÆ ÇÈÉÊËÌÍÎÏ ÐÑÒÓÔÕÖØÙÚÛÜÞÞ ßàáâäæææè èéêëìíîïðñòóôõö øùúûüýþÿ. Милослав Трмач (mlocate разработчик) говорят здесь официальный исходный код находится на pagure.io (и вилка на Github). Это может быть довольно распространенная ситуация, особенно для говорящих на испанском, французском и немецком языках.
7
задан 3 April 2018 в 07:00

4 ответа

Если мы посмотрим на 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
3
ответ дан 18 July 2018 в 14:16

Если мы посмотрим на 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
3
ответ дан 24 July 2018 в 20:21
  • 1
    Вы можете использовать grep -f или fgrep, чтобы избежать интерпретации "$CH" в качестве специального символа, e. г. grep ^ будет соответствовать любой строке, но grep -f ^ будет соответствовать только тем, которые содержат символ ^. Также может быть проще использовать классы символов для создания регулярного выражения, т.е. е. REG="[$CHARS]", вероятно, проще, чем ваша команда sed. Однако следите за специальными персонажами! В противном случае хороший подход. +1 – David Foerster 22 May 2017 в 12:13

Если мы посмотрим на 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
3
ответ дан 31 July 2018 в 11:15
  • 1
    Вы можете использовать grep -f или fgrep, чтобы избежать интерпретации "$CH" в качестве специального символа, e. г. grep ^ будет соответствовать любой строке, но grep -f ^ будет соответствовать только тем, которые содержат символ ^. Также может быть проще использовать классы символов для создания регулярного выражения, т.е. е. REG="[$CHARS]", вероятно, проще, чем ваша команда sed. Однако следите за специальными персонажами! В противном случае хороший подход. +1 – David Foerster 22 May 2017 в 12:13

Если мы посмотрим на 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
3
ответ дан 31 July 2018 в 12:16
  • 1
    Вы можете использовать grep -f или fgrep, чтобы избежать интерпретации "$CH" в качестве специального символа, e. г. grep ^ будет соответствовать любой строке, но grep -f ^ будет соответствовать только тем, которые содержат символ ^. Также может быть проще использовать классы символов для создания регулярного выражения, т.е. е. REG="[$CHARS]", вероятно, проще, чем ваша команда sed. Однако следите за специальными персонажами! В противном случае хороший подход. +1 – David Foerster 22 May 2017 в 12:13

Другие вопросы по тегам:

Похожие вопросы: