Como pode procurar por aspas simples e aspas duplas em uma pesquisa grep?

1

Quando faço uma pesquisa bindkey no diretório zsh plugins para conflitos de chave recebo respostas dos arquivos de script .zsh e .md , e alguns dos arquivos leiame zsh usam uma aspa dupla a declaração bindkey .

Como eu faria uma pesquisa por bindkeys usando ' e " para aspas? Por exemplo, se a pesquisa pelo uso de Ctrl-R o primeiro comando usando aspas duplas para a string correspondente produzir o README.md de zsh-navigation-tools e aspas simples produzirão o comando bindkey para ambos v i-mode e zsh-navigation-tools

grep -r -i 'bindkey "^r' ~/.oh-my-zsh/plugins

saída:

zsh-navigation-tools/README.md:    bindkey "^R" znt-history-widget
grep -r -i "bindkey '^r" ~/.oh-my-zsh/plugins

saída:

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

Como posso criar o comando que produzirá todos os 3?

O grep tem a opção de especificar um caractere alternativo de citações que permitirá ' e " como literais?

    
por vfclists 20.06.2017 / 18:23

2 respostas

2

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.

    
por 20.06.2017 / 19:23
2

Com a opção P ( --perl-regexp ) e a classe de caracteres [...] :

grep -Pri 'bindkey [72]\^r' ~/.oh-my-zsh/plugins
  • [72] - corresponde a uma cota única 7 ou cotação dupla 2
por 20.06.2017 / 18:40