Bash: Почему Echo добавляет дополнительное пространство?

StackOverflow https://stackoverflow.com/questions/2003536

  •  18-09-2019
  •  | 
  •  

Вопрос

Я получил:

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

ПРИМЕЧАНИЕ. Дополнительные пробелы перед DB и DC на 2 -й и 3 -й строке вывода.

Почему они там?

Спасибо, Дэн

Редактировать: Поскольку моя реальная цель имела места в нем (что я должен был писать изначально):

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

Большинство решений здесь не работали для меня (для Loop, Xarg, TR). Printf не работал из -за многочисленных расширений брекетов, которые я хочу для кантического продукта.

Я объединил 3 решения (дополнительное пространство Mletterle's 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:

Паттерны, которые должны быть расширены, принимают форму дополнительной преамбулы, за которой следует ... серия разделившихся запятых строк ... с последующим дополнительным постскриптум. Преамбула префикс на каждую строку, содержащуюся в брекетах, и затем PostScript добавляется к каждой результирующей строке, расширяя, например, вправо, {D, C, B} E расширяется в «Ade Abe 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 и сравните результаты.

Вы можете получить желаемый эффект, используя XARG для разделения аргументов, плевок с первым эхом на строку каждый:

$ 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top