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

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

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

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

不幸的是,每个附加的 URLurls.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

答案1

使用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
....

答案2

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

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[*]}")

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

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

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

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

答案3

这是标记为 zsh 的,所以我建议使用 zsh 内置函数print

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

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

答案4

问题是大括号扩展是添加空格,而 echo 是添加换行符。因此,使用单一责任原则,单独处理换行符。

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

相关内容