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

Я добираюсь:

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

Примечание: Дополнительные пространства перед Db и Dc на 2-й и 3-й строке вывода.

Почему это там?

Спасибо, Dan

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

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

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

Я объединил 3 решения (\b mletterle, дополнительное пространство Dennis Williamson и использование Jim Dennis намного меньше кавычек) для получения:

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

Спасибо все, кто ответил! Я узнал о много из Ваших ответов!

Dan

9
задан Dan 5 January 2010 в 16:33
поделиться

6 ответов

Самым простым и чистым решением является добавление обратного пространства к передней части каждой строки:

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

Это дает желаемый результат.

2
ответ дан 4 December 2019 в 07:23
поделиться

используйте более портативный printf

$ printf "D%s.jpg\n" {a,b,c}
Da.jpg
Db.jpg
Dc.jpg
10
ответ дан 4 December 2019 в 07:23
поделиться

Потому что это то, что делает расширение браслета. От man bash, под заголовком Brace expansion:

Patterns to be brace expansion take the вид необязательная преамбула, за которой следует ... серия разделенных запятыми строки... с последующим опциональным постскриптум. Преамбула является префиксом к каждой строке, содержащейся в скобки, и постскриптум затем добавляется к каждому полученному результату струна, расширяющаяся слева направо Например, a{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
10
ответ дан 4 December 2019 в 07:23
поделиться

echo всегда добавляет пробелы между аргументами. Попробуйте команду без \n и сравните результаты.

.
4
ответ дан 4 December 2019 в 07:23
поделиться

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

$ echo "D"{a,b,c}".jpg" | xargs -n1 echo
Da.jpg
Db.jpg
Dc.jpg
2
ответ дан 4 December 2019 в 07:23
поделиться

Вы можете получить более последовательный вид, предваряя нуль:

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

Теперь у них у всех есть дополнительное место. Также, использование -n устраняет лишнюю новую строку в конце. Также, вы можете использовать диапазон в расширении скобки.

2
ответ дан 4 December 2019 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: