シェルアレイブラケットを一致させると、ナノハイライトが失敗します。

シェルアレイブラケットを一致させると、ナノハイライトが失敗します。

最後の 2 つの配列拡張が正しく強調表示されません。

これを定義する設定は次のとおりですsh.nanorc

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

このエラーをキャッチするには、正規表現で何を修正する必要がありますか?

答え1

これらの正規表現は書き込み専用言語に似ていますが、中央が配列(\[([[:space:]]*[[:alnum:]_]+[[:space:]]*|@)\])?インデックスをキャプチャしているようです。また、[*]インデックスとして認識されません。

配列インデックスはほとんどすべてのシェル「表現式」になる可能性があるため、これを正しく修正することは困難です。整数インデックス配列では、インデックスは算術拡張として扱われ、sums[i+j]の合計を使用して同様のアプローチを作成できます。連想配列では、接続に使用できます。これは、シェルで過度に複雑な操作を実行したい場合にも発生する可能性があります。構文の強調を解析するには、単純な正規表現ではなく、ほぼ完全なパーサーが必要です。 (そしてコマンドの置き換えもありますが、そこまでは行きません…)ij[$x$y][i+a[j]]

[*]とにかく、変数名の前に合計を許可するのは簡単です。変更された部分は次のとおりです。$

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

結果全体の行は次のようになります。

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

私が知っている限り、${arr[]}これはバグなので、完全に強調表示する必要があるかどうかはわかりません。

これが最新バージョンの正規表現である場合は、バグレポートの公開を検討することもできます。

関連情報