Как искать одиночные кавычки и двойные кавычки в поиске grep?

Когда я выполняю поиск bindkey в bindkey zsh plugins для ключевых конфликтов, я получаю ответы от .zsh сценариев .zsh и файлов .md , а некоторые из файлов zsh readme используют двойную кавычку в заявлении bindkey .

Как я могу выполнить поиск для bindkeys, используя ' и " для цитирования? Например, если поиск для использования Ctrl-R первая команда с использованием двойных кавычек для соответствующей строки создает README.md из zsh-navigation-tools и одинарных кавычек создает команду bindkey для v 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 возможность указать альтернативный символ цитирования, который позволит ' и " как литералы?

  • Найдите строку (например, grep -q) только в одном разделе файла
  • Инкрементная арифметика Sed
  • Замена процесса (например, $ (somecommand)) В A Nutshell
  • программно создавая удаленный каталог с помощью ssh
  • Как получить чистую среду в оболочке ksh?
  • Как выполнять команды, последовательно эмулируя пользователя на терминале с помощью сценария оболочки
  • / dev / sda2 отправлено 49710 дней без проверки, проверьте принудительный
  • файл хвоста с удаленного сервера и nslookup на локальном
  • 2 Solutions collect form web for “Как искать одиночные кавычки и двойные кавычки в поиске grep?”

    Конечно, вам нужно избежать символа ^ :

     grep -r 'bindkey "\^r' dir 

    Затем вы можете использовать альтернативный символ расширенного регулярного выражения '|':

     grep -E 'bindkey "\^r''|'"bindkey '\^r" dir 

    Который может быть уменьшен до:

    grep -E 'bindkey ("|'"')"'\^r' dir [1]

    Или, если вы используете bash, ksh или zsh, используйте $' quoting (оба «и» могут быть экранированы):

     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] Может быть, трудно понять цитату.
    Но это просто конкатенация трех цитируемых частей.
    Строка, цитируемая одинарными кавычками, за которой следует строка с двойными кавычками, за которой следует третья строка, процитированная снова с одинарными кавычками. Самый простой способ увидеть efect – это повторить его. Оболочка удалит один уровень цитирования, и строка, которую фактически получает команда, становится ясной:

     $ 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 

    Альтернативой является использование списка символов […] с \' и \" :

     $ grep -E 'bindkey '[\"\']'\^r' dir 

    Это все еще строка из трех частей, но середина не цитируется (и нет пробелов):

     'bindkey ' [\"\'] '\^r' 

    Надеюсь это поможет.

    С параметром P ( --perl-regexp ) и классом символов [...] :

     grep -Pri 'bindkey [\047\042]\^r' ~/.oh-my-zsh/plugins 

    • [\047\042] – соответствует либо одиночной кавычки \047 либо двойной кавычки \042
    Linux и Unix - лучшая ОС в мире.