web-dev-qa-db-ja.com

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

すでにご存じかもしれませんが、最新の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エンジンを使用するように強制した場合にのみ解決されるという結論に達しました。これは可能ですか?もしそうなら、私はどのように手順を実行しますか?

11

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 

参考文献

14
slm

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.
0
site80443