쉘 배열 브래킷을 일치시킬 때 나노 강조 표시가 실패합니다.

쉘 배열 브래킷을 일치시킬 때 나노 강조 표시가 실패합니다.

마지막 두 배열 확장이 제대로 강조 표시되지 않습니다.

이를 정의하는 설정은 다음과 같습니다 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[]}이것은 버그이므로 완전히 강조 표시해야 하는지 잘 모르겠습니다.

이것이 최신 버전의 정규식이라면 버그 보고서 게시를 고려할 수도 있습니다.

관련 정보