Сопоставление только букв ASCII в регулярном выражении, игнорируя умляуты

Абсолютно никаких. Нет никакой причины использовать обратные кавычки в этом месте кода. И обратные кавычки в целом следует заменить на $(...), который лучше вкладывается и интуитивно обрабатывает цитирование.

Серьезно. Не пишите такой код.


Я вижу, откуда это могло взяться:

  1. Кто-то написал быстрый и грязный скрипт, чтобы куда-то переместить некоторые файлы.
  2. Они вставили эхо, чтобы «сделать это безопасным». Это позволило увидеть, какие команды будут выполнятьсябез риска перезаписать что-либо при тестировании. (Хорошая вещь)
  3. Кто-то еще решил, что им нужно выполнить эти команды, поэтому они просто поместили все в обратные кавычки.
  4. Прибыль!
  5. Позор!

Смежный вопрос: Когда следует использовать $( ) в определении переменных

И: В чем разница между $(stuff) и `stuff`?

0
06.09.2017, 02:15
1 ответ

Используйте:

REGEXP='^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0-9-]+$'

Для выбора нужных символов. То, что соответствует [a-z], гарантированно будет [abcdefghijkmnopqrstuvwxyz]только в локали C/POSIX.

(Я предполагаю, что вы не хотите включать обратную косую черту, но это \было ошибочной попыткой избежать-).

Другим вариантом является исправление языкового стандарта C перед использованием инструмента, который оценивает это ^[a-zA-Z0-9-]+$расширенное регулярное выражение (или ^[[:alnum:]-]+$), например:

LC_ALL=C grep -Ee "$REGEXP"

Это допустимо в данном случае, но не в таких случаях, как REGEXP='[A-Z]', если данные для сопоставления с регулярным выражением находятся в кодировке, такой как BIG5 -HKSCS или GB18030 (, и в локалях, которые используют тот же символ ), где многие символы имеют кодировку, содержащую ту же кодировку, что и A-Z.

Пример, где [A-Z]соответствуетÁ(U+00C1,кодируется как 0x88 0x57 в BIG5 -HKSCS (, где 0x57 такжеW)):

$ LC_ALL=zh_HK.big5hkscs REGEXP='[A-Z]' bash -c 'printf "\uc1\n" |
    LC_ALL=C grep -qe "$REGEXP" && echo match'
match
2
28.01.2020, 02:33

Теги

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