Linux Bash:如何避免行首出现空白?
在bash中给出这样一个命令:Linux Bash:如何避免行首出现空白?,linux,bash,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 "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
帮我修好。输出:
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保留这些空格,并根据请求简单地添加换行符。这些就是输出中显示的内容。将{…}
扩展为一系列以空格分隔的备选方案,因此实际上
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"
更新
另一种方法(未测试,抱歉)
用于生成用作命令参数的条目列表。生成的条目始终以空格分隔,因此会有额外的空格
要按原样使用{1..3}
语法,您需要使用一个命令,该命令可以将生成的每个条目视为一个独立的arg(echo
只需按它看到的内容打印出来)。这里的一个好选项是printf
(正如@glenn在上面的评论中所建议的那样)
为什么caret不从一开始就开始?这确实有效,但这是一个解决wierd问题的wierd解决方案。这似乎是解释
\n
的方式的一部分-如果将其移动到行的开头,则在输出行的末尾会有一个随机空格…这里,这可能说明bash有这种奇怪之处的原因。运行echo“abc”{1..3}
。您将看到bash输出:abc1 abc2 abc3
。注意中间的空格吗?当您使用换行符`echo“abc”{1..3}”\n时,bash会保留这些空格,并根据请求简单地添加一个换行符。这些就是输出中显示的内容。@nm:这不是很好,因为在输出的开头会有一行额外的内容output@KitHo:现在,在末尾有一个额外的换行符(可能可以避免使用一些额外的标志来echo
)。其他解决方案在最后一行有问题,删除第一行和删除最后一行一样简单,不是吗?sh也有这个问题吗?printf
可以更好地控制输出:printf“%s\n”ab{1..3}“de”
sh有{a..n}
吗?不,我不认为sh有花括号扩展。另一个解决方法:eval“echo”ab{1..3}“de';”
echo -e "\na b "{1..3}" d e"
printf "%s\n" "a b "{1..3}" d e"
[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