Регулярное выражение в сценарии удара

При необходимости в другом поведении, разорвана ли связь или циклическая, можно также использовать %Y с находкой:

$ touch a
$ ln -s a b  # link to existing target
$ ln -s c d  # link to non-existing target
$ ln -s e e  # link to itself
$ find . -type l -exec test ! -e {} \; -printf '%Y %p\n' \
   | while read type link; do
         case "$type" in
         N) echo "do something with broken link $link" ;;
         L) echo "do something with cyclic link $link" ;;
         esac
      done
do something with broken link ./d
do something with cyclic link ./e

Этот пример копируется с этого сообщения (удаленный сайт).

Ссылка

13
03.10.2013, 17:34
2 ответа

От man 7 regex:

Выражение скобки является списком символов, включенных в" []". …

… Для включения литерала '-', делают он первый или последний знак …. ll другие специальные символы, включая' \', теряют их специальное значение в рамках выражения скобки.

Попытка regexp с egrep дает ошибку:

$ echo "username : username usergroup" | egrep "^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"
egrep: Invalid range end

Вот более простая версия, которая также дает ошибку:

$ echo 'hi' | egrep '[\-_]'
egrep: Invalid range end

С тех пор \ не является особенным, который является диапазоном, точно так же, как [a-z] был бы. Необходимо поместить Ваш - в конце, как [_-] или:

echo "username : username usergroup" | egrep "^([a-zA-Z0-9_-]+ : [a-zA-Z0-9_-]+) (usergroup)$"
username : username usergroup

Это должно работать независимо от Вашей libc версии (или в egrep или в ударе).

править: Это на самом деле зависит от Ваших настроек локали также. Страница справочника действительно предупреждает об этом:

Диапазоны очень зависимы от сортирующей последовательности, и портативные программы должны постараться не полагаться на них.

Например:

$ echo '\_' | LC_ALL=en_US.UTF8 egrep '[\-_]'
egrep: Invalid range end
$ echo '\_' | LC_ALL=C egrep '[\-_]'
\_

Конечно, даже при том, что это не сделало ошибки, это не делает то, что Вы хотите:

$ echo '\^_' | LC_ALL=C egrep '^[\-_]+$'
\^_

Это - диапазон, который в ASCII, включает \, [, ^, и _.

14
27.01.2020, 19:53
  • 1
    Интересный. Мой egrep не дает ошибки, просто соответствия это правильно. –  manatwork 03.10.2013, 18:35
  • 2
    @manatwork Ваша сортирующая последовательность, вероятно, позволяет диапазону.... –  derobert 03.10.2013, 18:36
  • 3
    I не, знает много о сопоставлении. Вы имеете в виду это: LC_COLLATE="en_US.UTF-8"? –  manatwork 03.10.2013, 18:40
  • 4
    @manatwork я отредактировал вопрос дать пример. Обратите внимание, что это может отличаться в Вашей системе, потому что иногда они сопоставление (сортирующее) последовательности, изменяется. –  derobert 03.10.2013, 18:41
  • 5
    @manatwork Его OK, я почти зарегистрировал отчет об ошибках, прежде чем я заметил попытку выйти -... так как исключением –  derobert 03.10.2013, 18:44

Общее правило с regexps (и любые ошибки в больших частях кода): сократите его и восстановите его шаг за шагом или деление пополам использования - безотносительно работ лучше для Вас.

В этом случае преступник оказался подчеркиванием - выход, это с обратной косой чертой заставило его работать.

4
27.01.2020, 19:53

Теги

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