在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
第2行的输出...以空白开头。这是为什么?它从何而来?我怎么能避免呢?
我确实知道如何用sed或其他东西摆脱它,但我宁愿首先避免它。
我只提到它,和{..}一起使用 - 语法。还有其他相似的案例吗?
一个有用的解决方法是删除带有退格键的第一个字母:
echo -e "\ba b "{1..3}" d e\n"
或者,正如Jared Ng建议的那样:
echo -e "\ra b "{1..3}" d e\n"
我们摆脱了领先的新行:
echo -e "\na b "{1..4}" d e" | sed '1d'
echo -e "\na b "{1..4}" d e" | tail -n +2
或尾随:
echo -e "\ba b "{1..3}" d e\n" | sed '$d'
echo -e "\ba b "{1..3}" d e\n" | head -n 3
答案 0 :(得分:6)
echo -e "\ra b "{1..3}" d e\n"
为我修复它。输出:
a b 1 d e
a b 2 d e
a b 3 d e
(\r
是回车符 - 它将插入符号返回到行的开头,从而阻止了空格)
为什么bash这样做?运行echo "abc"{1..3}
。你会看到bash输出:abc1 abc2 abc3。注意两者之间的空格? {1..3}
扩展表达式,由空格分隔。当您使用换行符时,如echo "abc"{1..3}"\n"
中所述,bash会保留这些空格,并根据请求添加换行符。这些都是输出中显示的内容。
答案 1 :(得分:4)
{...}
扩展为一系列以空格分隔的替代方案,因此您实际上已经
echo "a b "1" d e\n" "a b "2" d e\n" "a b "3" d e\n"
\n
之后的空格是您在输出中看到的空格。
您可以尝试将\n
移动到字符串的开头,例如
echo -e "\na b "{1..3}" d e"
更新
另一种方法(未经测试,抱歉)
printf "%s\n" "a b "{1..3}" d e"
答案 2 :(得分:1)
Brace expansion旨在生成一个条目列表,用作命令的参数。生成的条目始终以空格分隔,因此需要额外的空格。
要按原样使用{1..3}
语法,您需要使用一个命令,可以将每个生成的条目视为一个独立的arg(echo
只是在看到它时将它们打印出来)。这里一个很好的选择是printf
(正如@glenn在上面的评论中所建议的那样)。
[me@home]$ printf "%s\n" "a b "{1..3}" d e"
a b 1 d e
a b 2 d e
a b 3 d e