すでにご存じかもしれませんが、最新の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エンジンを使用するように強制した場合にのみ解決されるという結論に達しました。これは可能ですか?もしそうなら、私はどのように手順を実行しますか?
5
スクリプトにbashではなくperlを使用しないのはなぜですか。そして、なぜこの質問はJavaScriptにタグ付けされているのですか?
—
マルコ
私の状況ではBashの使用が必須であるためです。そして、誤ってJavaScriptにタグを付けました。私はそれを削除しました:)
—
Fadi Hanna AL-Kass
grep
と一緒に、-P
またはを使ってみませんsed
か?
しかし、シェルに単純にできないことをシェルに行わせなければならないという結論に達した原因/状況を説明することは決してありません。もっと良い方法があります。
—
llua
私は後方参照があることを見つける行うのbash 4.3.x(Ubuntuの14.04)での作業を、ではなく、中にはbash 3.2倍(OS X)。ここに私のテストコマンドは次のとおりです。
—
デジタルトラウマ
re="([a-z])[0-9]\1"; [[ a1a =~ $re ]] && echo ${BASH_REMATCH[0]}