如何在 grep 搜尋中同時搜尋單引號和雙引號?
當我
bindkey
在zsh
外掛目錄中搜尋關鍵衝突時,我會從.zsh
腳本文件和文件中獲得響應,並且一些 zsh 自述文件在語句.md
中使用雙引號。bindkey
'
我將如何同時使用和引用來搜尋綁定鍵"
?例如,如果使用Ctrl-R
匹配字元串的雙引號搜尋第一個命令的用法會產生README.md
ofzsh-navigation-tools
和單引號會產生bindkey
vi-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 是否可以選擇指定一個備用引號字元,該字元將允許
'
和"
作為文字?
當然,您需要對
^
字元進行轉義: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 $$可能很難理解引用。
但它只是三個引用部分的串聯。
一個用單引號引起來的字元串,然後是一個用雙引號引起來的字元串,然後是第三個用單引號引起來的字元串。查看效果的最簡單方法是回顯它。shell 將刪除一個引用級別,命令實際接收的字元串變得清晰:
$ 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
[…]
另一種方法是使用帶有\'
and的字元列表\"
:$ grep -E 'bindkey '[\"\']'\^r' dir
那仍然是一個由三部分組成的字元串,但中間沒有被引用(也沒有空格):
'bindkey ' [\"\'] '\^r'
使用
P
(--perl-regexp
) 選項和字元類[...]
:grep -Pri 'bindkey [\047\042]\^r' ~/.oh-my-zsh/plugins
[\047\042]
- 匹配單引號\047
或雙引號\042