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
Короткий ответ:
Если вы просто хотите передать кучу строк в качестве аргументов другой команде, 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\""
С 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}
(для u
nique), удалите дубликаты ((u)
является флагом расширения параметра). Для списка файлов, не содержащих ни одной строки, замените -l
на -L
(при условии, что GNU grep
, но здесь вы уже используете специфичные для GNU параметры).-F
предназначен для фиксированного поиска строк (поскольку вы, вероятно, не хотите, чтобы эти имена проектов рассматривались как регулярные выражения). Вы также можете добавить опцию -w
к grep
для соответствия word, чтобы foo
не совпадало в Например, ]foobar
(все равно будет соответствовать в foo-bar
).