Я ищу файлы на основе регулярного выражения, а затем пытаюсь найти в этих файлах контент. Так, например, у меня есть что-то вроде
#Find all C++ files that match a certain pattern and then search them
find . -name "*.cpp" | grep "<name regex>" | xargs grep "<content regex>"
Проблема, с которой я сталкиваюсь, заключается в том, что в некоторых путях есть пробелы, что приводит в замешательство xargs
. Я знаю, что если бы я просто использовал find
, я мог бы использовать -print0
аргумент (вместе с -0
аргументом on xargs
), чтобы Xargs не рассматривал пробелы как разделители. Есть ли что-то подобное с grep
?
Или я совсем неправильно подхожу к этой проблеме? Наивно, find
чтобы grep
в xargs grep
имеет смысл для меня, но я открыт для других подходов , которые дают те же результаты.
xargs
помощью-i
параметра, а ляcat sample.txt | grep "pat t ern" | xargs -i grep "{}"
фигурные скобки сообщают ему, где позиционировать аргумент. Руководство говорит мне, что-i
это устарело в пользу,-I
так что, возможно, стоит взглянуть на это тоже.Ответы:
Возможно, используйте что-то вроде этого (если GNU grep).
человек grep
Также см. Параметры для нулевых разделителей.
источник
grep -r include='*.cpp'
это глобус оболочки - и так же выровнен по функциям без /find . -name '*.cpp' -exec grep -e 'content_pattern' -- {} \;
сfind . -name '*.cpp' | grep 'name_pattern' | xargs grep 'content_pattern'
Если вам приходится прыгать через много обручей, то эффективность xargs все равно теряется. Вот одна грубая работа:
Каждый раз, когда я сталкиваюсь с проблемами с пробелами в именах файлов, ответом является двойная кавычка для переменной.
источник
Используйте,
find
чтобы сделать всю фильтрацию имени файла. Скорее, чемделать
Если вы хотите сделать что-то немного более сложное, например,
ты можешь сделать
Обратите внимание, что они должны работать даже для файлов с символами новой строки в их именах.
И, если вам нужна мощь полноценных регулярных выражений, вы можете использовать
-regex
.источник
Это должно работать даже без инструментов GNU:
perl
Вызов заменяет разрывы строк с символами NULL, что позволитxargs -0
интерпретировать ввод на каждой линии основе , а не на основе каждого пробельных.Использование GNU, вы можете удалить
perl
вызов и измененияxargs -0 …
вxargs -d "\n" …
Нет
perl
или GNU? Попробуйawk '{printf "%s%c", $0, 0}'
вместо этого.источник
xargs -d "\n"
. Это очень необычное явление, но если у вас нет контроля над данными и вы беспокоитесь о том, что это может быть угрозой безопасности, будьте осторожны с ожидаемыми результатами.