BashにPerl RegExエンジンの使用を強制する


11

すでにご存じかもしれませんが、最新の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

2
grepと一緒に、-Pまたはを使ってみませんsedか?
cuonglm 2013

2
しかし、シェルに単純にできないことをシェルに行わせなければならないという結論に達した原因/状況を説明することは決してありません。もっと良い方法があります。
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]}
デジタルトラウマ

回答:


14

Bashは、現時点でこれを行うためのメソッドをサポートしていません。次のオプションがあります。

  1. Perlを使用する
  2. 使用する grep [-P|--perl-regexp]
  3. Bash機能を使用してコーディングする

私は#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 

参考文献


正直なところ、grepに[-P|--perl-regexp]トークンがあることを知りませんでした。
どうも

@ FadiHannaAL-Kass-どういたしまして。ご質問ありがとうございます。
slm

2
後世のために、GNU grepのみが-Pオプションを含み、それは普遍的ではありません。FreeBSDのgrepはGNUに基づいていますが、ドキュメントには「このオプションはFreeBSDではサポートされていません」と記載されています。OSXでは、grepもGNUに基づいていますが、-Pオプションはmanページでさえ言及されていません。また、grepがGNUでない他のUNIXシステムでは、-Pどこにも表示される可能性はほとんどありません。将来、移植性が役立つ可能性があるという可能性が少しでもあれば、このようなOS固有のオプションを使用しないことをお勧めします。
ghoti、2015年

pcregrep可能な場合は、これもオプションです。
ワイルドカード

REMATCH_PCREオプションが設定されている限り、zshはOPが要求したとおりに動作することに注意してください。
Tim Peoples

0

使用できますpcregreppcreCentOSおよびpcregrepUbuntuのパッケージに付属しています。

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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.