BASH:なぜエコーは余分なスペースを追加しているのですか?
質問
わかりました:
$ 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"
ここのほとんどのソリューションは私にとってはうまくいきませんでした(ループ、Xarg、TRの場合)。 Printfは、Cantesian製品をしたい複数のブレースの拡張のために機能しませんでした。
3つのソリューション(Mletterleの B、デニスウィリアムソンの余分なスペース、ジムデニスがはるかに少ない引用符を使用している)を組み合わせて取得しました。
echo -e "" \\bName{,.}\ {-,}extra{,so}\ 5v5\ {one,two,No\ four}{,\!,\!\!}\\n
答えたすべての人に感謝します!私はあなたの回答から多くを学びました!
ダン
解決
最も簡単でクリーンなソリューションは、各ラインの前面にバックスペースを追加することです。
echo -e -n "\bD"{a,b,c}".jpg\n"
これにより、目的の出力が生成されます。
他のヒント
よりポータブルなprintfを使用します
$ printf "D%s.jpg\n" {a,b,c}
Da.jpg
Db.jpg
Dc.jpg
それがブレースの拡張が行うことだからです。から man bash
, 、見出しの下 Brace expansion
:
ブレース拡張するパターンは、オプションのプリアンブルの形をとり、それに続いて...一連のコンマ分離された文字列が続きます...その後、オプションのポストスクリプトが続きます。プリアンブルはブレース内に含まれる各文字列に接頭辞が付けられ、その後、ポストスクリプトは結果の各文字列に追加され、たとえば左に拡張されます。
したがって、あなたの例では、「D」はプリアンブルであり、「.jpg n」はポストスクリプトです。
したがって、ブレースの拡張が発生した後、あなたは次のように残されています:
echo -e Da.jpg\n Db.jpg\n Dc.jpg\n
ヒューギルとして 指摘している, 、シェルはこれを3つのトークンに分割し、それらをエコーに渡します。スペースで区切られた各トークンを出力します。必要な出力を取得するには、トークン間の不要なスペースを再挿入しない多くの提案の1つをここで使用する必要があります。
それは長く、おそらくこれを行うための最もきちんとした方法ではありませんが、以下はあなたが後にしている出力を与えます:
for file in "D"{a,b,c}".jpg"
do
echo ${file}
done
echo
常に引数の間にスペースを追加します。なしであなたのコマンドを試してください \n
結果を比較します。
Xargsを使用して、最初のエコーによって引数のスピットを分離することで、それぞれの希望の効果を得ることができます。
$ echo "D"{a,b,c}".jpg" | xargs -n1 echo
Da.jpg
Db.jpg
Dc.jpg
ヌルを準備することで、より一貫した外観を得ることができます。
$ echo -en "" "D"{a..c}".jpg\n"
Da.jpg
Db.jpg
Dc.jpg
今、彼らはすべて余分なスペースを持っています。また、使用します -n
最後に追加の新しいラインを排除します。また、ブレース拡張で範囲を使用することもできます。
これがソリューションを使用しています sed
(それは上に構築されます https://stackoverflow.com/a/2003856/8180143):
$ 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