Bash
強制 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 引擎時才能得到解決。這是可行的嗎?如果是這樣,我將如何執行該程序?
Bash 目前不支持您執行此操作的方法。您有以下選擇:
- 使用 Perl
- 採用
grep [-P|--perl-regexp]
- 使用 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
參考