我使用以下命令创建了要测试的 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 示例看起来很奇怪,因为:
- 它在子 shell 中运行(括号),因此我不会更改 IFS 的当前值。
- 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"