如果像这样重定向输出,我可以删除换行符吗?
echo "a" >> file
我的脚本中有类似的内容,其中包含一个 for 循环,将每个字符(数字除外)重定向到文件。但我的目标是将这个输出放在一行中。假设我将“a”重定向十次,因此它应该如下所示:
a a a a a a a a a a
但它看起来像这样:
a
a
a
a
[etc.]
答案1
如果您特别询问echo
,您可以使用-n
抑制换行符:
$ echo -n "test" >> outputfile
如果您更一般地询问如何抑制管道或重定向数据中的换行符,这是一只带有许多皮肤。一种简单的方法是tr
:
$ do_stuff | tr -d "\n" >> outputfile
如果您刚刚开始编写脚本和输出数据,最好摆脱echo
完全使用的习惯,转而使用printf
:
$ printf "test" >> outputfile
printf
在许多方面和出于多种原因优于echo
,其中最重要的是它仅有的打印您明确告诉它的内容(并且,可以说更重要的是,以您想要的格式)。
答案2
我认为您不想删除换行符,而是用空格替换它们:
for ((i=0; i<10; ++i)); do
echo a
done | tr '\n' ' ' >file
这只是对您的输出进行后处理echo
并将数据保存到file
(首先截断它,如果它已经存在)。
或者做一些更奇特的事情(在bash
),
for ((i=0; i<10; ++i)); do
array+=( "a" )
done
printf '%s\n' "${array[*]}" >file
这样做的优点是可以用最后一个换行符正确地终止该行,而数组的所有元素都由空格( 的第一个字符$IFS
)分隔。
或者,与/bin/sh
:
i=0
set --
while [ "$i" -lt 10 ]; do
set -- "$@" "a"
i=$(( i + 1 ))
done
printf '%s\n' "$*" >file
答案3
for i in `seq 1 10`; do
printf "a " >> file
done
应该可以解决问题。