web-dev-qa-db-ja.com

grep検索で単一引用符と二重引用符の両方を検索するにはどうすればよいですか?

キーの競合についてbindkeyプラグインディレクトリでzshを検索すると、.zshスクリプトファイルと.mdファイルの両方から応答が返されます。一部のzsh readmeファイルでは、 bindkeyステートメント。

引用に'"の両方を使用してバインドキーを検索するにはどうすればよいですか?たとえば、Ctrl-Rの使用法を検索する場合、一致する文字列に二重引用符を使用する最初のコマンドはREADME.mdzsh-navigation-toolsを生成し、単一引用符はvi-modezsh-navigation-toolsの両方に対してbindkeyコマンドを生成します

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

3つすべてを出力するコマンドを作成するにはどうすればよいですか?

Grepには、'"の両方をリテラルとして許可する代替引用文字を指定するオプションがありますか?

2
vfclists

もちろん、_^_文字をエスケープする必要があります。

_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
_

そして最後に、2つのrrRがあることを理解してください:

_grep -rE $'bindkey (\"|\')\^(r|R)' dir
_

または、iを使用します(ただし、他の文字も変更されます)。

_grep -riE $'bindkey (\"|\')\^r' dir
_

もちろん、これはPerl正規表現(GNU grep)でもあります。

_grep -rP $'bindkey (\"|\')\^(r|R)' dir
_

[1]見積もりを理解するのは難しいかもしれません。
しかし、それは単に3つの引用部分の連結です。
単一引用符で囲まれた文字列、その後に二重引用符で囲まれた文字列、それに続けて単一引用符で囲まれた3番目の文字列。効果を確認する最も簡単な方法は、エコーすることです。シェルは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
_

それはまだ3つの部分からなる文字列ですが、中央は引用されていません(スペースはありません)。

_'bindkey '    [\"\']     '\^r'
_
2
Isaac

P--Perl-regexp)オプションと文字クラス[...]を使用:

grep -Pri 'bindkey [\047\042]\^r' ~/.oh-my-zsh/plugins

  • [\047\042]-単一引用符\047または二重引用符\042に一致します
3
RomanPerekhrest