Bash: Почему эхо добавляет дополнительное пространство? - PullRequest
9 голосов
/ 05 января 2010

Я получаю:

$ 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"

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

Я объединил 3 решения (mletterle's \ b, дополнительное пространство Денниса Уильямсона и Джима Денниса, использующее гораздо меньше кавычек), чтобы получить:

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

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

Dan

Ответы [ 7 ]

10 голосов
/ 05 января 2010

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

$ printf "D%s.jpg\n" {a,b,c}
Da.jpg
Db.jpg
Dc.jpg
10 голосов
/ 05 января 2010

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

Шаблоны для расширения скобки принимают форма необязательная преамбула, сопровождаемая ... серией через запятую строки ... с последующим необязательным постскриптум. Преамбула имеет префикс к каждой строке, содержащейся в фигурные скобки, и затем постскриптум добавляется к каждому результату строка, расширяющаяся слева направо Например, a {d, c, b} e расширяется в "Ade ace abe"

Итак, в вашем примере «D» - это преамбула, а «.jpg \ n» - постскриптум.

Итак, после того, как произойдет расширение фигурной скобки, у вас останется:

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

Когда Хьюджилл указывает , оболочка затем разделяет это на три жетона и передает их в эхо; который выводит каждый токен через пробел. Чтобы получить желаемый результат, вам нужно использовать одно из множества предложений, которые не вставляют ненужный пробел между токенами.

Это более длинный и, вероятно, не самый удачный способ сделать это, но следующий результат дает результат, который вам нужен:

for file in "D"{a,b,c}".jpg"
do
  echo ${file}
done
4 голосов
/ 05 января 2010

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

2 голосов
/ 05 января 2010

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

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

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

2 голосов
/ 05 января 2010

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

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

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

2 голосов
/ 05 января 2010

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

$ echo "D"{a,b,c}".jpg" | xargs -n1 echo
Da.jpg
Db.jpg
Dc.jpg
0 голосов
/ 08 февраля 2019

Вот решение, использующее 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
...