Wie Sie vielleicht bereits wissen, werden viele der Funktionen, die moderne RegEx-Engines unterstützen (Rückverweise, Lookaround-Behauptungen usw.), von der Bash RegEx-Engine nicht unterstützt. Es folgt ein einfaches Bash-Skript, das ich gerade erstellt habe, um zu erklären, was mein Endziel ist:
#!/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
So gibt beispielsweise der folgende Befehl false zurück:
. match.sh "catfish" "(?=catfish)fish"
Der exakt gleiche Ausdruck findet eine Übereinstimmung, wenn er in einem Perl- oder JavaScript-Regex-Tester verwendet wird.
Rückreferenzen (zB (Ausdruck1) (Ausdruck2) [] \ 1 \ 2) stimmen ebenfalls nicht überein.
Ich bin einfach zu dem Schluss gekommen, dass mein Problem nur gelöst werden kann, wenn bash gezwungen wird, eine Perl-kompatible RegEx-Engine zu verwenden. Ist das machbar? Wenn ja, wie würde ich vorgehen, um das Verfahren durchzuführen?
grep
mit -P
oder mit sed
?
re="([a-z])[0-9]\1"; [[ a1a =~ $re ]] && echo ${BASH_REMATCH[0]}