Bash

nano 突出顯示在匹配 shell 數組括號時失敗

  • July 7, 2022

最後兩個數組擴展沒有得到正確的突出顯示:

這是sh.nanorc定義它的設置:

# More complicated variable names; handles braces and replacements and arrays.
color brightred "\$\{[#!]?([-@*#?$!]|[0-9]+|[[:alpha:]_][[:alnum:]_]*)(\[([[:space:]]*[[:alnum:]_]+[[:space:]]*|@)\])?(([#%/]|:?[-=?+])[^}]*\}|\[|\})"

我必須在正則表達式中修復什麼才能趕上這個失誤?

像這樣的正則表達式有點像只寫語言,但我認為(\[([[:space:]]*[[:alnum:]_]+[[:space:]]*|@)\])?中間的 擷取了數組索引。它也不辨識[*]為索引。

很難正確解決這個問題,因為數組索引幾乎可以是任意的 shell“表達式”。在整數索引數組中,索引被視為算術擴展,類似的東西[i+j]可以使用 和 的ij。在關聯數組中,它可以用於例如[$x$y]連接。[i+a[j]]如果要在 shell 中做一些過於復雜的事情,也可能是這樣。解析語法高亮幾乎需要一個完整的解析器,而不是一個簡單的正則表達式。(然後是命令替換,但我們不要去那裡……)

無論如何,很容易讓它接受變數名前面的[*]and ,這是更改的部分:$

... (\[([[:space:]]*\$?[[:alnum:]_]+[[:space:]]*|[@*])\])? ...
                   ^^^                          ^^^^

以及由此產生的整行:

color brightred "\$\{[#!]?([-@*#?$!]|[0-9]+|[[:alpha:]_][[:alnum:]_]*)(\[([[:space:]]*\$?[[:alnum:]_]+[[:space:]]*|[@*])\])?(([#%/]|:?[-=?+])[^}]*\}|\[|\})"

據我所知,這${arr[]}是一個錯誤,所以我不確定它是否應該全部突出顯示。

如果這是最新版本的正則表達式,您可能還需要考慮發布錯誤報告。

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