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
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
最後に:r
とR
: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
これが将来の誰にでも役立つことを願っています!