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

3つのコマンドをすべて出力するコマンドをどのように作成できますか?

'許可する代替引用符文字を"リテラルとして指定する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:2つのことがあることを認識してください。

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

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

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

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

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

[1]引用は理解しにくいかもしれません。
しかし、これは単に引用された3つの部分を結ぶだけです。
一重引用符で囲まれた文字列、二重引用符で囲まれた文字列、二重引用符で囲まれた3番目の文字列が続きます。効果を確認する最も簡単な方法はエコーすることです。シェルは最初のレベル参照を削除し、コマンドによって実際に受け取られた文字列は明確になります。

$ 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

もう1つの方法は、 と[…]一緒に文字リストを使用することです。\'\"

$ grep -E 'bindkey '[\"\']'\^r' dir

これはまだ3つの部分からなる文字列ですが、間に引用符がなく、スペースもありません。

'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

これが将来の誰にでも役立つことを願っています!

関連情報