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

Мой желаемый результат следующий: рекурсивно искать каталог, ищущий заданную строку во всех найденных файлах. Следующей командой является мой обычный порт захода:

find ./ | xargs grep -ns 'foobar' 

Однако, когда foobar имеет кавычки, команда выходит из строя и дает мне подсказку > в оболочке. Конкретная команда, вызывающая проблему, выглядит следующим образом:

  • Как запустить grep в одном столбце?
  • найти общие строки в каждом столбце в одном файле
  • Узнать, сколько программ я не установил из списка с помощью grep / awk в archlinux
  • Узнайте, на какой строке в текстовом файле соответствует слово
  • Как взять список и удалить его из файла?
  • Графические консольные приложения в Emacs
  •  find ./ | xargs grep -ns 'add_action(\'save_post\',' 

    Я пытался избежать цитат с обратной косой чертой, но безрезультатно. Каков правильный способ сделать это?

  • Как grep файл bz2, который находится далее в папке с zip-файлом
  • Поиск шаблона регулярного выражения для чередующегося символьного случая
  • Подсчет количества строк, имеющих число больше 100
  • SSH дважды и запустить команду, экранируя символ?
  • Как использовать результат grep в командной строке?
  • В команде grep я могу изменить на ?
  • 3 Solutions collect form web for “Как передать строки с одинарными кавычками в grep?”

    Одиночные кавычки оканчиваются одинарными кавычками; все остальные символы между ними сохраняются точно так же, как есть, включая обратную косую черту. Таким образом, невозможно вставить одну кавычку между одинарными кавычками. (Но вы можете закончить одинарные кавычки, избежать одиночной кавычки и начать новый набор одинарных кавычек, как в 'Single quotes aren'\''t ever really embedded in single quotes.' )

    Предложение: избегайте поиска + xargs, когда grep -r pattern . может рекурсивно grep в текущем каталоге.

    Следующие команды имеют эквивалентное поведение:

     grep -rns "add_action('save_post'," . grep -rns 'add_action('\'save_post\', . 

    Последняя команда интерпретируется как:

    1. 'add_action(' -> add_action(
    2. \' -> '
    3. save_post -> save_post
    4. \' -> '
    5. , -> ,

    Объединяя эти части, команда grep получает аргумент add_action('save_post',

    xargs ожидает аргументы, процитированные каким-то странным образом, что find не производит. Никогда не используйте xargs в сочетании с find , если вы не знаете, что имена ваших файлов не содержат \"' пробелов \"' или «пробелов».

    Вместо использования xargs , find прямое вызов программы, которую вы хотите запустить.

     find . -exec grep -ns 'add_action('\''save_post'\'',' {} + 

    С exec … {} + программа вызывается один раз для многих файлов одновременно, например, с помощью xargs . Некоторые более старые версии find не поддерживают + здесь¹, тогда вы должны использовать ; вместо этого, который вызывает grep один раз для каждого файла.

    Вы также можете использовать find … -print0 | xargs -0 find … -print0 | xargs -0 , если ваши утилиты поддерживают его¹. Опция -print0 указывает find чтобы испускать имена, разделенные нулевым байтом, и -0 указывает xargs ожидать xargs с нулевым значением и не выполнять интерпретацию цитирования.

    Обратите внимание на приведенное выше цитату: между одинарными кавычками все символы интерпретируются буквально, за исключением того, что ' означает конец литеральной строки. Таким образом, '\'' – эффективный способ поставить буквенную одиночную кавычку внутри строки с одним кавычком; формально, это «конечная цитата, \ literal ' одинарная кавычка, ' начало цитаты».

    В специальном случае grep , если ваша реализация поддерживает его¹, вы можете отказаться от find и использования grep -r для поиска в каталоге рекурсивно:

     grep -r 'add_action('\''save_post'\'',' . 

    ¹ Linux, Cygwin, FreeBSD и OSX поддерживают эти функции.

     grep "add_action('save_post'," ./* -R 
    1. Вы можете grep все файлы в текущем каталоге рекурсивно с параметром -R .

    2. Строка поиска может быть окружена " .

    Linux и Unix - лучшая ОС в мире.