Bash:如何在一行的开头避免空白?

时间:2011-08-15 16:44:41

标签: linux bash

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

更新2:

我们摆脱了领先的新行:

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

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