3 回答

TA貢獻2037條經驗 獲得超6個贊
因為這是一個常見的常見問題解答,所以讓我列出一些Bash不支持的結構,以及如何解決它們,這里有一個簡單的解決方法。
正則表達式有多種常用方言。Bash支持的是擴展正則表達式的變體。例如,這不同于許多在線正則表達式測試器支持的功能,后者通常是更現代的Perl 5 / PCRE變體。
擊不支持\d \D \s \S \w \W-這些可以與POSIX字符類等同替換[[:digit:]],[^[:digit:]],[[:space:]],[^[:space:]],[_[:alnum:]],和[^_[:alnum:]],分別。(請注意最后一種情況,其中[:alnum:]POSIX字符類使用下劃線增強,以完全等同于Perl的\w速記形式。)
Bash不支持非貪婪匹配。有時您可以a.*?b用類似的東西代替,a[^ab]*b以在實踐中獲得類似的效果,盡管兩者并不完全相同。
Bash不支持非括號(?:...)。在平凡的情況下,只需使用捕獲括號即可(...);當然,如果您使用捕獲組和/或反向引用,則會重新編號捕獲組。
擊不支持lookarounds像(?<=before)或者(?!after),事實上任何與(?是一個Perl擴展。盡管您經常可以將問題改寫為可以避免環顧的問題,但沒有簡單的常規解決方法。

TA貢獻1794條經驗 獲得超8個贊
我知道您已經“解決”了這個問題,但是您最初的問題很可能就像$regex在測試中不引用一樣簡單。即:
if [[ $data =~ "$regex" ]]; then
Bash變量擴展將簡單地放入字符串中,并且原始正則表達式中的空格將破壞測試,因為:
regex="^Disk (/dev[\S]+):((?!Disk)[\s\S])*"
if [[ $data =~ $regex ]]; then
等價于:
if [[ $data =~ ^Disk (/dev[\S]+):((?!Disk)[\s\S])* ]]; then
bash / test會很有趣地解釋獎金參數和所有未引用的元字符。
請記住,bash不會傳遞變量,而是會擴展變量。
- 3 回答
- 0 關注
- 542 瀏覽
添加回答
舉報