سؤال

انا حصلت:

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

ملاحظة: المسافات الإضافية قبل DB و DC على السطر الثاني والثالث من الإخراج.

لماذا هذه هناك؟

شكرا دان

يحرر: نظرا لأن هدفي الفعلي كان لديه مسافات في ذلك (الذي يجب أن كتبته في الأصل):

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

معظم الحلول هنا لم تنجح بالنسبة لي (لحلقة، Xarg، TR). لم تنجح PrintF بسبب توسعات متعددة الأقواس التي أرغب في إنتاجها.

كنت مجتمعة 3 حلول (MLETERLE B، Dennis Williamson الإضافي، وجيم دينيس باستخدام اقتباسات أقل بكثير) للحصول على:

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

شكرا كل الذين أجابوا! تعلمت الكثير من ردودكم!

دان

هل كانت مفيدة؟

المحلول

الحل الأسهل والنظافة هو إضافة مسافة ظهر إلى مقدمة كل سطر:

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

هذا ينتج الإخراج المطلوب.

نصائح أخرى

استخدام طبعات أكثر محمولة

$ printf "D%s.jpg\n" {a,b,c}
Da.jpg
Db.jpg
Dc.jpg

لأن هذا هو ما يفعله توسع هدفين. من man bash, ، تحت العنوان Brace expansion:

توسعت الأنماط لتوسيع نطاق الاستدعاء شكل ديباجة اختياري، تليها ... سلسلة من سلاسل مفصولة بفواصل ... تليها بوستسكريبت اختيارية. يتم بادئة الديباجة إلى كل سلسلة تحتوي داخل الأقواس، ثم يتم إلحاق بوستسكريبت في كل سلسلة ناتجة، وتوسيع اليسار إلى اليمين على سبيل المثال، وهو {d، c، b} e يتوسع إلى "ADE ACE ABE"

لذلك في مثالك، "D" هو الديباجة و ".jpg n" هي بوستسكريبت.

لذلك، بعد حدوث توسيع هدفين، تركت مع:

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

كما hewgill. يشير الى, ، شل ثم تقسيم هذا إلى ثلاثة رموز ويمرهم إلى صدى؛ التي مخرجات كل رمزية مفصولة عن طريق الفضاء. للحصول على الإخراج الذي تريده، تحتاج إلى استخدام أحد الاقتراحات العديدة هنا التي لا تعيد إدخال المساحة غير المرغوب فيها بين الرموز.

إنها أطول وربما لا تكون الطريقة التي لا تؤديها إلى القيام بذلك، ولكن ما يلي يعطي الناتج بعد:

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

يمكنك الحصول على نظرة أكثر اتساقا عن طريق إعداد NULL NULL:

$ 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top