vi 모드에서 "foo.*bar"에 대한 bash 기록을 검색하는 방법

vi 모드에서 "foo.*bar"에 대한 bash 기록을 검색하는 방법

내 bash 환경은 vi 모드( set -o vi)입니다. 그래서 단어를 입력 <ESC>/하고 Enter 키를 누르면 bash가 해당 단어에 대한 기록을 검색할 수 있습니다. /이것이 vi가 정규식을 검색하는 방법이기도 하므로 bash도 정규식을 검색할 것이라고 가정했습니다 .

불행하게도 bash를 입력하면 <ESC>/foo.*bar기록에서 정규식과 일치하는 행을 찾을 수 없습니다 foo.*bar.

제가 간과하고 있는 것이 있나요? 아니면 정규식 기록을 검색하는 것이 불가능합니까?

답변1

짧은 대답은 당신이 할 수 있다는 것입니다아니요정규식을 사용하여 쉘 기록을 검색합니다. ~에 따르면POSIX(Unix 계열 운영 체제의 표준) 일반 검색을 사용할 수 있어야 합니다.쉘 패턴 매칭(파일 이름 글로빙 및 case명령문용) 이 기능을비증분 검색그러나 현재 Bash에서는 올바르게 구현되지 않는 것 같습니다.

POSIX 사양

쉘에 대한 POSIX 사양명령줄 편집(vi 모드)이러한 검색 패턴이 일반 셸 패턴 일치를 사용해야 함을 나타냅니다. ^메타 문자는 줄의 시작 부분을 일치시키는 데 사용 되지만아니요자주 사용되는 표현.

/pattern<newline>

이전 명령줄부터 시작하여 명령 기록을 뒤로 탐색하여 지정된 패턴을 검색합니다. 패턴 사용법에 설명된 패턴 일치 기호패턴 일치 표기법 , 그러나 "^" 문자는 첫 번째 문자로 나타날 때 특별한 의미를 가져야 합니다.무늬. 이 경우 "^"는 삭제되고 "^" 이후의 문자는 줄의 시작 부분에서만 일치됩니다. 명령 기록의 명령은 파일 이름이 아닌 문자열로 처리되어야 합니다.

Bash 구현 문서화

배쉬 사용GNU 읽기 라인라이브러리는 대화형 라인 편집 및 내역 검색 기능을 제공합니다. Readline 라이브러리의 공식 문서는 Emacs 모드에 더 초점을 맞추고 있지만 매뉴얼에는 다음과 같은 작은 섹션이 있습니다.Readline vi 모드지적

Readline 라이브러리에는 전체 vi 편집 기능 세트가 없지만 간단한 줄 편집이 가능한 충분한 기능이 포함되어 있습니다.

Readline vi 모드는 POSIX 표준에 지정된 대로 작동합니다.

실제 Bash 구현

두 가지 다른 시스템에서 많은 실험을 한 후에 Bash/Readline의 비증분 검색이 공식 문서에 설명된 대로 작동하지 않는다는 것을 발견했습니다. *별표는 여러 문자와 일치하는 패턴이 아닌 리터럴로 처리되는 것으로 나타났습니다 . 마찬가지로 ?[는 리터럴 문자로 처리됩니다.

비교를 위해 Vi-mode를 사용해 보고 tcshPOSIX 표준에 명시된 기록 검색을 올바르게 구현하는지 확인했습니다.

그런 다음 Readline 라이브러리에 대한 코드를 다운로드하여 검색한 결과 이력 검색 기능이 간단한 하위 문자열 검색을 사용하고 캐럿을 제외하고 검색 패턴 메타 문자를 사용하지 않는다는 것을 발견했습니다 ^(참조search.cReadline 라이브러리의 git 저장소).

Bash/Readline 개발자는 아직 이 기능을 구현하지 않은 것 같습니다. 버그 목록을 찾을 수 없지만 CHANGES문서에는 Vi 모드와 관련된 문제를 정기적으로 수정해 왔다고 나와 있습니다.

고쳐 쓰다: 이 기능은 Readline 8.0(2019년 1월 Bash 5.0과 함께 출시됨)에서 구현되었습니다. 기록된 대로다양성:

Readline의 새로운 기능

ㅏ. 비증분 vi 모드 검색( N, n)은 Posix에서 지정한 대로 쉘 모드를 검색합니다( fnmatch(3)사용 가능한 경우 사용됨).

관련 정보