grep 검색에서 작은따옴표와 큰따옴표를 모두 검색하는 방법은 무엇입니까?

grep 검색에서 작은따옴표와 큰따옴표를 모두 검색하는 방법은 무엇입니까?

bindkey플러그인 디렉토리에서 심각한 충돌을 검색하면 스크립트 파일과 파일 zsh에서 응답을 얻고 일부 zsh 추가 정보 파일에서는 명령문에 큰따옴표를 사용합니다..zsh.mdbindkey

'를 사용하고 인용하여 바인딩된 키를 어떻게 검색할 수 있나요 "? 예를 들어 Ctrl-R첫 번째 명령의 사용법을 검색하기 위해 일치 문자열로 큰따옴표를 사용하면 명령이 생성되고 README.md작은 따옴표는 v 및 v 명령이 zsh-navigation-tools생성됩니다.bindkeyi-modezsh-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마지막으로 : rR: 두 가지가 있다는 것을 인식하십시오 .

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

이것이 미래의 누구에게나 도움이 되기를 바랍니다!

관련 정보