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

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

find ./ | xargs grep -ns 'foobar' 

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

  • Почему этот однострочный лайнер не может произвести вывод?
  • Как вырезать вывод, чтобы только собрать имя файла и получить параметр?
  • Рекурсивный поиск не работает для grep on solaris
  • Найти файл по hash
  • Разделить двоичные данные фиксированного байтового смещения по байтовой позиции?
  • Сценарий оболочки для поиска и подсчета общего количества символов во всех файлах
  •  find ./ | xargs grep -ns 'add_action(\'save_post\',' 

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

  • Как подсчитать количество вхождений слова в текстовый файл с помощью командной строки?
  • Найти файл с расширением .csv в каталоге, соответствующем шаблону
  • Grep для строки со списком файлов в качестве источника
  • Сделать xargs в качестве первого параметра
  • генерировать ссылки страниц с добавочной переменной
  • правильное параллельное использование xargs
  • 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 - лучшая ОС в мире.