Claro, você precisa escapar do caractere ^
:
grep -r 'bindkey "\^r' dir
Em seguida, você pode usar o caractere alternativo "Regex estendido" "|":
grep -E 'bindkey "\^r''|'"bindkey '\^r" dir
Que pode ser reduzido para:
grep -E 'bindkey ("|'"')"'\^r' dir
[1]
Ou, se estiver usando bash, ksh ou zsh, use o $'
quoting (ambos 'e "podem ser escapados):
grep -E $'bindkey (\"|\')\^r' dir
E, finalmente, perceba que existem dois r
: r
e R
:
grep -rE $'bindkey (\"|\')\^(r|R)' dir
Ou use i
(mas isso também alterará outros caracteres):
grep -riE $'bindkey (\"|\')\^r' dir
Claro, isso também é um regex perl (GNU grep):
grep -rP $'bindkey (\"|\')\^(r|R)' dir
[1] Pode ser difícil entender a citação.
Mas é simplesmente uma concatenação de três partes citadas.
Uma string entre aspas simples seguidas por uma string entre aspas duplas seguida por uma terceira string citada novamente com aspas simples. A maneira mais fácil de ver o efeito é ecoar. O shell removerá um nível de cotação e a string que o comando realmente recebe fica clara:
$ echo grep -E 'bindkey ("|' "')" '\^r' dir
grep -E bindkey ("| ') \^r dir
Talvez seja mais fácil ver com:
$ echo grep -E 'a'"b"'c' dir
grep -E abc dir
O mesmo pode ser escrito em um par de aspas simples.
Lembre-se de que aspas simples não podem ser incluídas entre aspas simples:
$ echo grep -E 'bindkey ("|'\'')\^r' dir
grep -E bindkey ("|')\^r dir
Ou entre aspas duplas (as aspas duplas podem ser inseridas entre aspas duplas). Com o risco adicional de que alguns outros caracteres ($, ', \, * e @) tenham um significado especial entre aspas duplas (não entre aspas simples):
$ echo grep -E "bindkey (\"|')\^r" dir
grep -E bindkey ("|')\^r dir
Uma alternativa é usar uma lista de caracteres […]
com \'
e \"
:
$ grep -E 'bindkey '[\"\']'\^r' dir
Essa ainda é uma sequência de três partes, mas o meio não está entre aspas (e não há espaços):
'bindkey ' [\"\'] '\^r'
Espero que isso ajude.