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?
quelle
grep
mit-P
oder mitsed
?re="([a-z])[0-9]\1"; [[ a1a =~ $re ]] && echo ${BASH_REMATCH[0]}
Antworten:
Bash unterstützt derzeit keine Methode, mit der Sie dies tun können. Sie haben folgende Möglichkeiten:
grep [-P|--perl-regexp]
Ich denke, ich würde mit # 2 gehen und versuchen, das
grep
zu bekommen, was ich funktional will. Für die Rückreferenzierung können Sie Folgendes tungrep
:Verweise
quelle
[-P|--perl-regexp]
Token hat. Vielen Dank :-)-P
Option, und sie ist nicht universell. FreeBSDs grep basiert auf GNU, aber in der Dokumentation heißt es "Diese Option wird in FreeBSD nicht unterstützt". In OSX basiert grep ebenfalls auf GNU, aber die-P
Option wird in der Manpage nicht einmal erwähnt. Und auf anderen Unix-Systemen, deren Grep nicht GNU ist, ist es unwahrscheinlich, dass Sie-P
überhaupt etwas sehen. Wenn Sie die Möglichkeit haben, dass Portabilität in Zukunft für Sie nützlich sein könnte, empfehle ich, solche betriebssystemspezifischen Optionen zu vermeiden.pcregrep
ist auch eine Option, falls verfügbar.REMATCH_PCRE
Option festgelegt ist.Man könnte es gebrauchen
pcregrep
. Es kommt mit dem Paketpcre
in CentOS undpcregrep
in Ubuntu.grep -P
könnte dieses Problem je nach Betriebssystem / Version haben:quelle