Given such a command in bash:
echo -e "a b "{1..3}" d e\n"
a b 1 d e
a b 2 d e
a b 3 d e
the output of line 2... starts with a blank. Why is that? Where does it come from? How can I avoid it?
I do know how to get rid of it with sed or something else, but I would prefer to avoid it in the first place.
I've only mentioned it, together with {..}-Syntax. Are there other, similar cases, without it?
A useful workaround is, to remove the first letter with backspace:
echo -e "\ba b "{1..3}" d e\n"
or, as Jared Ng suggests:
echo -e "\ra b "{1..3}" d e\n"
We get rid of leading newlines with:
echo -e "\na b "{1..4}" d e" | sed '1d'
echo -e "\na b "{1..4}" d e" | tail -n +2
or trailing:
echo -e "\ba b "{1..3}" d e\n" | sed '$d'
echo -e "\ba b "{1..3}" d e\n" | head -n 3
echo -e "\ra b "{1..3}" d e\n"
Fixes it for me. Output:
a b 1 d e
a b 2 d e
a b 3 d e
(\r
is the carriage return -- it brings the caret back to the beginning of the line, preventing the space)
Why does bash do this? Run echo "abc"{1..3}
. You'll see that bash outputs: abc1 abc2 abc3. Notice the spaces in between? {1..3}
expands the expression, delimited by spaces. When you use a newline, as in echo "abc"{1..3}"\n"
, bash keeps those spaces and simply adds a newline as requested. Those are what show up in the output.
The {...}
expands to a sequence of space-delimited alternatives, so you have in effect
echo "a b "1" d e\n" "a b "2" d e\n" "a b "3" d e\n"
The spaces after \n
are the spaces you're seeing in the output.
You can try to move \n
to the beginning of your string, like in
echo -e "\na b "{1..3}" d e"
Update
Another method (untested, sorry)
printf "%s\n" "a b "{1..3}" d e"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With