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

удар поддерживает массивы:

http://tldp.org/LDP/abs/html/arrays.html

ИЛИ

COUNT=0
for i in `ls *.txt`
do
  COUNT=`expr $COUNT + 1`
  mv "$i" "$COUNT-$i"
done

Это переименовало бы файлы a.txt b.txt c.txt к 1-a.txt 2-b.txt 3-c.txt.

3
03.04.2012, 12:33
3 ответа

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

Предложение: Избегайте find+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',.

7
27.01.2020, 21:10
  • 1
    большое понимание на интерпретации, Спасибо! –  Matthew 03.04.2012, 13:19

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

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

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

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

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

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

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

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

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

2
27.01.2020, 21:10
  • 1
    Спасибо за информацию о -print0 и -0, Я посмотрел на эти опции прежде, но никогда не понимал их достаточно хорошо для фактического получения результатов, в которых я нуждался. Я буду использовать grep -rns с этого времени. –  Matthew 04.04.2012, 12:23
grep "add_action('save_post'," ./* -R
  1. Вы можете grep все файлы в текущем каталоге рекурсивно с -R опция.

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

1
27.01.2020, 21:10

Теги

Похожие вопросы