すでにご存じかもしれませんが、最新の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エンジンを使用するように強制した場合にのみ解決されるという結論に達しました。これは可能ですか?もしそうなら、私はどのように手順を実行しますか?
Bashは、現時点でこれを行うためのメソッドをサポートしていません。次のオプションがあります。
grep [-P|--Perl-regexp]
私は#2を使い、grep
を使用して機能的に必要なものを取得すると思います。後方参照の場合、grep
を使用して以下を実行できます。
$ echo 'BEGIN `helloworld` END' | grep -oP '(?<=BEGIN `).*(?=` END)'
helloworld
-o, --only-matching show only the part of a line matching PATTERN
-P, --Perl-regexp PATTERN is a Perl regular expression
(?=pattern)
is a positive look-ahead assertion
(?!pattern)
is a negative look-ahead assertion
(?<=pattern)
is a positive look-behind assertion
(?<!pattern)
is a negative look-behind assertion
pcregrep
を使用できます。 CentOSではpcre
パッケージ、Ubuntuではpcregrep
パッケージが付属しています。
grep -P
OS /バージョンによっては、この問題が発生する可能性があります:
-P, --Perl-regexp
Interpret PATTERN as a Perl regular expression. This is highly experimental and grep -P may warn of unimplemented features.