如何在大括号扩展期间抑制生成的参数之间的空间?

ico*_*ast 8 bash zsh brace-expansion

我使用以下命令创建了要测试的 URL 列表:

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

不幸的是,附加到urls.txt每个URL之前都有一个空格(当然第一个除外)。我明白为什么会发生这种情况,并且我意识到我可以通过管道通过一个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
Run Code Online (Sandbox Code Playgroud)

也没有将其更改为换行符:

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

cuo*_*glm 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
....
Run Code Online (Sandbox Code Playgroud)


gle*_*man 9

您可以将大括号扩展存储在一个数组中,然后以您选择的方式输出它:

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

然后

printf "%s\n" "${urls[@]}"
Run Code Online (Sandbox Code Playgroud)

或者

(IFS=$'\n'; echo "${urls[*]}")
Run Code Online (Sandbox Code Playgroud)

echo 示例看起来很奇怪,因为:

  1. 它在子shell(括号)中运行,所以我不会改变我当前的 IFS 值。
  2. IFS 需要在单独的命令中定义:
    • 这不起作用:IFS=$'\n' echo "${urls[*]}"因为变量在新的 env 变量生效之前被扩展
    • 开始扩展变量之前需要设置 IFS 。

另外,请注意所使用的解引用数组索引的细微差别:

  • [@] 在 printf 示例中将数组扩展为单个单词
  • [*] 在 echo 示例中将数组扩展为单个单词,元素由 IFS 的第一个字符分隔


Lei*_*iaz 6

这被标记为 zsh,所以我建议使用 zsh 内置print

print -l localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}
Run Code Online (Sandbox Code Playgroud)

-l 在单独的行上打印参数。