Как я могу подавить пробел между сгенерированными аргументами во время расширения фигурной скобки?

8

Я использовал следующую команду для создания списка URL, которые я хочу протестировать:

echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}"\n" >> urls.txt

К сожалению, URL-адреса, добавленные к urls.txtкаждому, имели перед ними пробел (за исключением первого, конечно). Я понимаю, почему это произошло, и я понимаю, что мог бы просто снять его, обнажив sedвыражение лица, но я хотел бы знать, есть ли способ подавить это вместо этого. (Это может показаться глупым и педантичным, но это ничем не отличается от предпочтения, которое многие люди считают « не злоупотреблять кошками» .)

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

Я попытался изменить IFS на пустую строку, но это тоже не сработало:

IFS='' echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}"\n" >> urls.txt

Также не изменив его на новую строку:

IFS='\n' echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}"\n" >> urls.txt
иконоборец
источник
Вы используете Bash или Zsh?
Брайам
на данный момент я использую bash (я на работе), но на своем ноутбуке я использую zsh. Я ожидал, что расширение скобок будет работать одинаково в обоих случаях, но, возможно, это не так.
иконоборчество
В этом случае ответ Gnouc будет наиболее совместим с различными оболочками.
Брайам
Разве ответ Ричарда не будет одинаково совместимым? (Он также имеет преимущество в том, что он проще, поэтому мне не нужно останавливаться и думать о неловких битах в следующий раз, когда я захочу его использовать.) С другой стороны, ответ Gnouc также превосходен. И я думаю, что узнал больше всего из ответа Гленна Джексона. Ответ Лейаса кажется самым простым и изящным, но, конечно, только для zsh.
иконоборчество

Ответы:

8

Вы могли бы сохранить расширение скобки в массиве, а затем вывести его способом по вашему выбору:

urls=( localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload} )

затем

printf "%s\n" "${urls[@]}"

или

(IFS=$'\n'; echo "${urls[*]}")

Пример эха выглядит странно, потому что:

  1. он запускается в подоболочках (в скобках), поэтому я не изменяю текущее значение IFS.
  2. IFS должен быть определен в отдельной команде:
    • Это не работает: IFS=$'\n' echo "${urls[*]}"потому что переменная раскрывается до вступления в силу новой переменной env
    • IFS должен быть установлен до того, как вы начнете расширять переменные.

Также обратите внимание на небольшую разницу в используемом индексе массива разыменования:

  • [@] в примере printf, чтобы развернуть массив в отдельные слова
  • [*] в примере эха, чтобы развернуть массив в одно слово, с элементами, разделенными первым символом IFS
Гленн Джекман
источник
Это сложный вызов, но я выбираю этот ответ, потому что (1) кажется (AFAIK) ближе всего к заявленной цели подавления, а не просто удаления пробелов, и (2) я узнал больше всего из этого ( поставленная цель моего вопроса).
иконоборчество
16

Используйте printfвстроенный:

$ printf %s\\n localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}
localhost:8080/reports/promos/130
localhost:8080/reports/promos/130.pdf
localhost:8080/reports/promos/130.xls
localhost:8080/reports/promos/130.xlsx
localhost:8080/reports/promos/130.csv
localhost:8080/reports/promos/130.preload
localhost:8080/reports/promos/130-unburdened
localhost:8080/reports/promos/130-unburdened.pdf
localhost:8080/reports/promos/130-unburdened.xls
localhost:8080/reports/promos/130-unburdened.xlsx
localhost:8080/reports/promos/130-unburdened.csv
localhost:8080/reports/promos/130-unburdened.preload
....
cuonglm
источник
6

Это тег zsh, поэтому я предлагаю встроенный zsh print:

print -l localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}

-l выводит аргументы в отдельных строках

Leiaz
источник
+1 Спасибо - приятно знать! Я буду использовать это, когда я на Zsh. Я отметил это просто потому, что я использую оба и оба поддерживают расширение скобки. (Я не знаю, делают ли это другие, но я нахожу, что ksh ужасно сбивает с толку, поэтому я держусь подальше.)
иконоборец
3

Проблема в том, что расширение скобки добавляет пробел, а echo добавляет символ новой строки. Таким образом, используя принцип единой ответственности, обрабатывайте новую строку отдельно.

echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload} | tr " " "\n"
Ctrl-Alt-Делор
источник
Я думаю, что это самый простой и самый практичный подход
иконоборца
Нет, расширение скобки не добавляет пробела, оно создает несколько аргументов echo. Вот echoчто выводит свои аргументы через пробел.
Стефан Шазелас
Я предполагаю, что проблема возникает, потому что echoразделяет аргументы пробелами, и новая строка вставляется перед каждым пробелом вместо замены пробела (что было бы более разумно). По памяти, xargsесть известная проблема, очень похожая на эту (особенно с -0опцией)
syntaxerror