12

私は得る:

$ echo -e "D"{a,b,c}".jpg\n"
Da.jpg
 Db.jpg
 Dc.jpg

注:出力の2行目と3行目のDbとDcの前の余分なスペース。

なぜこれらがあるのですか?

ありがとう、ダン

編集:私の実際の目的にはスペースが含まれていたので(元々書いていたはずです):

echo -e "Name"{,.}" "{-,}"extra"{,so}" 5v5 "{one,two,No\ four}{,!,\!\!}"\n"

ここでのほとんどのソリューションは私には機能しませんでした(forループ、xarg、tr)。カンテシアン製品にしたい複数のブレース拡張のため、Printfは機能しませんでした。

3つのソリューション(mletterleの\ b、Dennis Williamsonの余分なスペース、Jim Dennisの引用符の使用量がはるかに少ない)を組み合わせて、次のようにしました。

echo -e "" \\bName{,.}\ {-,}extra{,so}\ 5v5\ {one,two,No\ four}{,\!,\!\!}\\n

答えてくれたすべての人に感謝します!あなたの回答からたくさんのことを学びました!

ダン

4

7 に答える 7

12

それがブレース拡張が行うことだからです。からman bash、見出しの下Brace expansion

ブレース展開されるパターンは、オプションのプリアンブルの後に...一連のコンマ区切りの文字列...の後にオプションのポストスクリプトが続く形式を取ります。前文は中括弧内に含まれる各文字列の前に付けられ、後書きは結果の各文字列に追加され、左から右に展開されます。たとえば、a {d、c、b}eは「adeaceabe」に展開されます。</p>

したがって、あなたの例では、「D」は前文であり、「。jpg\n」は後文です。

したがって、ブレースの拡張が発生した後は、次のようになります。

echo -e Da.jpg\n Db.jpg\n Dc.jpg\n

hewgillが指摘しているように、シェルはこれを3つのトークンに分割し、それらをエコーに渡します。スペースで区切られた各トークンを出力します。必要な出力を取得するには、トークン間に不要なスペースを再挿入しない、ここにある多くの提案の1つを使用する必要があります。

それはより長く、おそらくこれを行うための最も良い方法ではありませんが、以下はあなたが求めている出力を与えます:

for file in "D"{a,b,c}".jpg"
do
  echo ${file}
done
于 2010-01-05T01:23:21.070 に答える
12

よりポータブルなprintfを使用する

$ printf "D%s.jpg\n" {a,b,c}
Da.jpg
Db.jpg
Dc.jpg
于 2010-01-05T01:54:30.197 に答える
5

echo常に引数の間にスペースを追加します。せずにコマンドを試して\n、結果を比較してください。

于 2010-01-05T01:22:46.920 に答える
2

xargsを使用して、最初のエコーによって吐き出された引数をそれぞれ1行に分割することで、目的の効果を得ることができます。

$ echo "D"{a,b,c}".jpg" | xargs -n1 echo
Da.jpg
Db.jpg
Dc.jpg
于 2010-01-05T01:42:40.190 に答える
2

最も簡単でクリーンな解決策は、各行の前にバックスペースを追加することです。

echo -e -n "\bD"{a,b,c}".jpg\n"

これにより、目的の出力が生成されます。

于 2010-01-05T01:53:20.107 に答える
2

nullを付加することで、より一貫性のある外観を得ることができます。

$ echo -en "" "D"{a..c}".jpg\n"
 Da.jpg
 Db.jpg
 Dc.jpg

今、それらはすべて余分なスペースを持っています。また、を使用-nすると、最後に余分な改行がなくなります。また、ブレース拡張で範囲を使用できます。

于 2010-01-05T02:46:41.903 に答える
0

( https://stackoverflow.com/a/2003856/8180143sedに基づいて構築された)を使用したソリューションは次のとおりです。

$ echo -en "" "D"{a..c}".jpg\n" | sed 's/ //'
Da.jpg
Db.jpg
Dc.jpg

このソリューションには、スペースを持つ入力を処理できるという利点があります。

$ echo -en "" "D "{a..c}".jpg\n" | sed 's/ //'
D a.jpg
D b.jpg
D c.jpg
于 2019-02-08T20:32:40.610 に答える