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 

인용하다

답변2

하나를 사용할 수 있습니다 pcregrep. pcreCentOS 및 Ubuntu의 패키지와 함께 제공됩니다 pcregrep.

grep -P운영 체제/버전에 따라 이 문제가 발생할 수 있습니다.

-P, --perl-regexp
              Interpret PATTERN as a Perl regular expression.  This is highly experimental and grep -P may warn of unimplemented features.

관련 정보