ブレース展開中に生成された引数間のスペースを抑制するにはどうすればよいですか?


8

次のコマンドを使用して、テストするURLのリストを作成しました。

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

残念ながら、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

また、改行に変更しませんでした。

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を使用していますか?
Braiam 14

現時点ではbash(仕事中)を使用していますが、自分のラップトップではzshを使用しています。ブレースの拡張が両方で同じように機能することを期待していましたが、おそらくそうではありません。
iconoclast 14

その場合、Gnoucの回答がさまざまなシェルと最も互換性があります。
Braiam 14

リチャードの答えは同等に互換性がないでしょうか?(また、単純であるという利点もあります。そのため、次回使用したいときに手間を省いて考える必要はありません。)一方、Gnoucの答えも優れています。そして、グレン・ジャクソンの答えから私は最も多くを学んだと思います。Leiazの答えは最も単純でエレガントなようですが、もちろんzshのみです。
iconoclast 14

回答:


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[*]}"新しい環境変数が有効になる前に変数が展開されるため
    • 変数の展開を開始する前に IFSを設定する必要があります。

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

  • [@] 配列を個々の単語に拡張するprintfの例
  • [*] エコーの例では、IFSの最初の文字で要素を区切って、配列を単一の単語に拡張します

それは難しいコールですが、(1)(AFAIK)は単にスペースを削除するのではなく、抑制の指定の目標に最も近いようであり、(2)私はそれから最も多くを学んだ(a)私の質問の述べられた目標)。
iconoclast 14

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

6

これはzshとタグ付けされているので、zsh builtinをお勧めしprintます。

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

-l 引数を別々の行に出力します。


+1ありがとうございます。zshを使用しているときに使用します。両方を使用し、両方がブレース拡張をサポートしているという理由だけでタグ付けしました。(他の人がそうかどうかはわかりませんが、kshはひどく混乱しているので、近づかないようにしています。)
iconoclast 14

3

問題は、ブレースの展開によってスペースが追加され、エコーによって改行が追加されることです。したがって、単一責任の原則を使用して、改行を個別に処理します。

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

これが最も単純で最も実用的なアプローチだと思います
イコノクラスト2014

いいえ、ブレース展開はスペースを追加するものではなく、にいくつかの引数を作成しますecho。これはecho、引数をスペースで区切って出力するものです。
ステファンChazelas

echo引数をスペースで区切り、スペースを置き換えるのではなく、各スペースの前に改行が追加されるため、問題が発生すると思います(これはより賢明です)。メモリから、xargsこれと非常によく似た既知の問題があり-0ます(特にオプションに関して)
syntaxerror '
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.