BashにPerl RegExエンジンを使用させる

BashにPerl RegExエンジンを使用させる

すでに知っていますが、Bash RegExエンジンは最新の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エンジンを使用するように強制している場合にのみ、私の問題を解決できるという結論に達しました。これは可能ですか?それでは、手順をどのように実行する必要がありますか?

ベストアンサー1

Bashは現在これを行う方法をサポートしていません。次のオプションがあります。

  1. パールを使う
  2. 使用grep [-P|--perl-regexp]
  3. Bash関数を使用したコーディング

grep私は#2を使用して私が望む機能を手に入れようとしていると思います。逆参照の場合は、次のことができます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 

引用する

おすすめ記事