Конвейер от находки к grep

Printf в bash не имеет этой опции.

Но простое решение - использовать переменные:

$ a=a b=b c=c
$ printf '%s %s %s %s %s %s %s\n' "$a" "$c" "$a" "$c" "$b" "$c" "$a"
a c a c b c a

Или даже позиционные параметры:

$ set -- a b c
$ printf '%s %s %s %s %s %s %s\n' "$1" "$3" "$1" "$3" "$2" "$3" "$1"
a c a c b c a
8
26.03.2017, 22:30
2 ответа

Короткий ответ:

Если вы просто хотите передать кучу строк в качестве аргументов другой команде, xargs будет вашим другом - в этом случае, поскольку вы вставляете его в середину команды, вы захотите использовать флаг -I {}. Это установит {} в качестве заполнителя, который вы можете поместить куда угодно (вы можете установить свой собственный заполнитель, но я обычно придерживаюсь {}, так как он не будет перепутан с другими вещами.

Собираем все вместе (предполагая, что команды, которые вы дали, делают то, что вы думаете!):

find server/lib -type f -exec basename {} \; | cut -f 1 -d '.' | xargs -I {} grep -R --exclude-dir=node_modules {} . -l

Длинный ответ

Хорошо, возможно, мы можем пойти дальше. Допустим, вам нужен формат, о котором вы говорили ранее - вы можете xargs в sh -c, так что вы можете составить цепочку команд:

find server/lib -type f -exec basename {} \; | cut -f 1 -d '.' | xargs -I {} sh -c "echo {}; grep -R --exclude-dir=node_modules {} . -l"

Запустив это на моей машине, похоже, что это дает вам файлы, в которых найден файл is. Мой мозг устал, поэтому вместо того, чтобы завернуть это в красивый скрипт (что, собственно, и нужно делать, когда oneliners начинают глючить, и использовать https://www.shellcheck.net/, пока вы это делаете), вы можете использовать этот ужасный хак, который (я думаю) даст вам искомый результат:

find server/lib -type f -exec basename {} \; | cut -f 1 -d '.' | xargs -I {} sh -c "echo {}; grep -R --exclude-dir=node_modules {} . -l && printf \"\n\" || printf \"Not found\n\n\""

2
27.01.2020, 20:12

С zsh:

projects=(server/lib/**/*(D.:t:r))
grep -rFl --exclude-dir=node_modules -e${(u)^projects} .
  • **/ рекурсивная подстановка. Функция, представленная zsh в начале 90-х.
  • (D.:t:r) — это квалификатор glob, специфичная для zsh функция, которая позволяет выбирать файлы с использованием атрибутов, отличных от имени, или изменять сортировку или выполнять модификации найденных файлов. файлы.
  • D: включить точечные файлы и просмотреть точечные каталоги, как find. Скорее всего, вы захотите снять его.
  • . : только обычные файлы (например, -типа f в find)
  • :t, :r: модификаторы истории, как в csh/bash, но здесь применяется к файлам с подстановкой. :t для хвоста (базовое имя), :r для корневого имени (расширение удалено).
  • x${^array} распределяет такие элементы, как rc x^$array или fish x$ массив подойдет. Например, если $массив равно (1, 2). Это становится x1 x2.
  • ${(u)array} (для unique), удалите дубликаты ((u) является флагом расширения параметра).

Для списка файлов, не содержащих ни одной строки, замените -l на -L (при условии, что GNU grep, но здесь вы уже используете специфичные для GNU параметры).-F предназначен для фиксированного поиска строк (поскольку вы, вероятно, не хотите, чтобы эти имена проектов рассматривались как регулярные выражения). Вы также можете добавить опцию -w к grep для соответствия word, чтобы foo не совпадало в Например, ]foobar (все равно будет соответствовать в foo-bar).

6
27.01.2020, 20:12

Теги

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