Bash

強制 Bash 使用 Perl RegEx 引擎

  • November 19, 2016

您可能已經知道,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 引擎時才能得到解決。這是可行的嗎?如果是這樣,我將如何執行該程序?

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 

參考

引用自:https://unix.stackexchange.com/questions/84477