Как вы, возможно, уже знаете, многие функции, поддерживаемые современными механизмами 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]}