Как вы, возможно, уже знаете, многие функции, поддерживаемые современными механизмами RegEx (обратные ссылки, обходные утверждения и т. Д.), Не поддерживаются механизмом Bash RegEx. Ниже приведен простой скрипт Bash, который я только что создал, чтобы попытаться объяснить, какова моя конечная цель:
#!/bin/bash
# Make sure exactly two arguments are passed.
if [ $# -lt 2 ]
then
echo "Usage: match [string] [pattern]"
return
fi
variable=${1}
pattern=${2}
if [[ ${variable} =~ ${pattern} ]]
then
echo "true"
else
echo "false"
fi
Так, например, что-то вроде следующей команды вернет false:
. match.sh "catfish" "(?=catfish)fish"
тогда как точно такое же выражение найдет совпадение при использовании в Perl или в тестере регулярных выражений JavaScript.
Обратные ссылки (например, (expr1) (expr2) [] \ 1 \ 2) также не будут совпадать.
Я просто пришел к выводу, что моя проблема будет решена, только если заставить bash использовать Perl-совместимый движок RegEx. Это выполнимо? Если так, как бы я пошла на выполнение процедуры?
источник
grep
с-P
или используетеsed
?re="([a-z])[0-9]\1"; [[ a1a =~ $re ]] && echo ${BASH_REMATCH[0]}
Ответы:
Bash не поддерживает метод для вас сделать это в настоящее время. У вас остались следующие варианты:
grep [-P|--perl-regexp]
Я думаю, я бы пошел с # 2 и попытался бы использовать
grep
то, что я хочу функционально. Для обратной ссылки вы можете сделать следующееgrep
:Ссылки
источник
[-P|--perl-regexp]
токен. Большое спасибо :-)-P
опцию, и она не универсальна. Grep во FreeBSD основан на GNU, но в документации говорится: «Этот параметр не поддерживается во FreeBSD». В OSX grep также основан на GNU, но эта-P
опция даже не упоминается на странице руководства. А в других системах Unix, в которых grep не является GNU, вы вряд ли сможете увидеть его-P
где-либо вообще. Если существует вероятность того, что переносимость может быть полезна для вас в будущем, я рекомендую избегать таких опций, специфичных для ОС, как этот.pcregrep
также вариант, если имеется.REMATCH_PCRE
опция установлена.Можно использовать
pcregrep
. Поставляется с пакетомpcre
в CentOS иpcregrep
в Ubuntu.grep -P
может иметь эту проблему в зависимости от ОС / версии:источник