Shell

如何在 grep 搜尋中同時搜尋單引號和雙引號?

  • April 2, 2020

當我bindkeyzsh外掛目錄中搜尋關鍵衝突時,我會從.zsh腳本文件和文件中獲得響應,並且一些 zsh 自述文件在語句.md中使用雙引號。bindkey

'我將如何同時使用和引用來搜尋綁定鍵"?例如,如果使用Ctrl-R匹配字元串的雙引號搜尋第一個命令的用法會產生README.mdofzsh-navigation-tools和單引號會產生bindkeyvi-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 是否可以選擇指定一個備用引號字元,該字元將允許'"作為文字?

當然,您需要對^字元進行轉義:

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 $$可能很難理解引用。

但它只是三個引用部分的串聯。

一個用單引號引起來的字元串,然後是一個用雙引號引起來的字元串,然後是第三個用單引號引起來的字元串。查看效果的最簡單方法是回顯它。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

引用自:https://unix.stackexchange.com/questions/372276