如何从重定向输出中删除换行符

如何从重定向输出中删除换行符

如果像这样重定向输出,我可以删除换行符吗?

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

应该可以解决问题。

相关内容