中括弧拡張中に生成された引数間のスペースを抑制する方法は?

中括弧拡張中に生成された引数間のスペースを抑制する方法は?

以下を使用してテストする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の前にスペースが続きます(もちろん、最初の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

また改行に変更せず:

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

エコの例は、次の理由で奇妙に見えます。

  1. サブシェル(括弧)で実行されるため、IFSの現在の値は変更されません。
  2. IFSは別々のコマンドで定義する必要があります。
    • これはうまくいきません。IFS=$'\n' echo "${urls[*]}"これは、新しい環境変数が適用される前に変数が拡張されるためです。
    • IFSを設定する必要があります。今後変数の拡張を開始します。

また、使用された逆参照配列インデックスの微妙な違いに注意してください。

  • [@]printfの例では、配列を単一の単語に展開する
  • [*]エコーの例では、配列を単一の単語に拡張し、要素は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"

関連情報