bindkey
플러그인 디렉토리에서 심각한 충돌을 검색하면 스크립트 파일과 파일 zsh
에서 응답을 얻고 일부 zsh 추가 정보 파일에서는 명령문에 큰따옴표를 사용합니다..zsh
.md
bindkey
'
를 사용하고 인용하여 바인딩된 키를 어떻게 검색할 수 있나요 "
? 예를 들어 Ctrl-R
첫 번째 명령의 사용법을 검색하기 위해 일치 문자열로 큰따옴표를 사용하면 명령이 생성되고 README.md
작은 따옴표는 v 및 v 명령이 zsh-navigation-tools
생성됩니다.bindkey
i-mode
zsh-navigation-tools
grep -r -i 'bindkey "^r' ~/.oh-my-zsh/plugins
산출:
zsh-navigation-tools/README.md: bindkey "^R" znt-history-widget
grep -r -i "bindkey '^r" ~/.oh-my-zsh/plugins
산출:
vi-mode/vi-mode.plugin.zsh:bindkey '^r' history-incremental-search-backward
zsh-navigation-tools/zsh-navigation-tools.plugin.zsh:bindkey '^R' znt-history-widget
세 가지 명령을 모두 출력하는 명령을 어떻게 만들 수 있나요?
'
허용할 대체 따옴표 문자 를 "
리터럴로 지정하는 grep 옵션이 있습니까 ?
답변1
P
( --perl-regexp
) 옵션과 문자 클래스를 사용하십시오 [...]
.
grep -Pri 'bindkey [\047\042]\^r' ~/.oh-my-zsh/plugins
[\047\042]
- 작은\047
따옴표 또는 큰따옴표와 일치합니다.\042
답변2
물론 ^
문자를 이스케이프 처리해야 합니다.
grep -r 'bindkey "\^r' dir
그런 다음 "확장 정규식"을 사용하여 "|" 문자를 바꿀 수 있습니다.
grep -E 'bindkey "\^r''|'"bindkey '\^r" dir
다음과 같이 단순화할 수 있습니다.
grep -E 'bindkey ("|'"')"'\^r' dir
[1]
또는 bash, ksh 또는 zsh를 사용하는 경우 $'
따옴표를 사용합니다(' 및 " 모두 이스케이프 가능).
grep -E $'bindkey (\"|\')\^r' dir
r
마지막으로 : r
와 R
: 두 가지가 있다는 것을 인식하십시오 .
grep -rE $'bindkey (\"|\')\^(r|R)' dir
또는 i
다음을 사용하십시오(단, 다른 문자도 변경됩니다):
grep -riE $'bindkey (\"|\')\^r' dir
물론 이것은 Perl 정규식(GNU grep)이기도 합니다.
grep -rP $'bindkey (\"|\')\^(r|R)' dir
[1] 인용문은 이해하기 어려울 수 있습니다.
그러나 이것은 단지 인용된 세 부분을 연결한 것에 불과합니다.
작은따옴표로 묶인 문자열, 큰따옴표로 묶인 문자열, 다시 작은따옴표로 묶인 세 번째 문자열이 옵니다. 효과를 확인하는 가장 쉬운 방법은 에코하는 것입니다. 쉘은 첫 번째 레벨 참조를 제거하고 명령에 의해 실제로 수신된 문자열은 명확해집니다.
$ echo grep -E 'bindkey ("|' "')" '\^r' dir
grep -E bindkey ("| ') \^r dir
아마도 다음이 더 보기 쉬울 것입니다.
$ echo grep -E 'a'"b"'c' dir
grep -E abc dir
동일한 내용을 작은따옴표 쌍 안에 쓸 수도 있습니다.
작은따옴표 안에 작은따옴표를 포함할 수 없다는 점을 기억하세요.
$ echo grep -E 'bindkey ("|'\'')\^r' dir
grep -E bindkey ("|')\^r dir
또는 큰따옴표 안에 있습니다(큰따옴표는 큰따옴표 내에서 이스케이프될 수 있습니다). 추가적인 위험은 일부 다른 문자($, `, \, * 및 @)가 큰따옴표 안에(작은따옴표 안에 있지 않음) 특별한 의미를 갖는다는 것입니다.
$ echo grep -E "bindkey (\"|')\^r" dir
grep -E bindkey ("|')\^r dir
또 다른 방법은 및 와 […]
함께 문자 목록을 사용하는 것입니다 .\'
\"
$ grep -E 'bindkey '[\"\']'\^r' dir
이는 여전히 세 부분으로 구성된 문자열이지만 사이에 따옴표가 없고 공백도 없습니다.
'bindkey ' [\"\'] '\^r'
답변3
큰따옴표로 구분된 텍스트 내에서 큰따옴표를 이스케이프할 수 있습니다.
따라서 이 패턴은 "[\"']"
일치합니다 "
.'
예를 들어:
$ echo "'a'" | grep "[\"']a[\"']"
$ echo '"a"' | grep "[\"']a[\"']"
$ echo -e "\"thing\"\n'thing'\nthing" | grep -E "('thing'|\"thing\")"
TD;DR;
환경 변수에서 패턴을 정의한 다음 grep 명령을 호출할 때 큰따옴표를 사용하여 변수를 확장할 수 있습니다.
HTML의 title 속성에 포함된 텍스트를 보면 텍스트가 ' 또는 " 로 시작하고 ' 또는 " 로 끝날 수 있습니다. 따라서 패턴은 다음 중 하나일 수 있습니다.
$ title=["'].*["'] # (Greddy)
$ title=["'].*?["'] # (Non greddy)
$ title=["'][^"']*["'] # ("Non greddy" using negagation)
따라서 가장 좋은 패턴을 선택하여 변수에 저장한 다음 grep 명령을 호출할 때 해당 변수를 사용하여 패턴을 지정합니다.
$ pattern="title=[\"'].*[\"']" # DO MIND ESCAPING THE INNER DOUBLE QUOTES (as they "outer" double quotes are used to define the text boundaries)
$ grep $pattern file
이것이 미래의 누구에게나 도움이 되기를 바랍니다!