이미 알고 계시겠지만 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는 현재 이 작업을 수행하는 방식을 지원하지 않습니다. 다음과 같은 옵션이 있습니다.
- 펄 사용하기
- 사용
grep [-P|--perl-regexp]
- 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
. pcre
CentOS 및 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.