如何在同一行上打印多行输出?

有没有方法在同一行上打印多行输出(单输出)?

例如,如果输出为:

abc def qwerty 

是否可以打印:

 abcdefqwerty 

您可以使用tr -d从给定集中删除所有出现的字符。 要删除换行符,请使用:

 tr -d '\n' 

与往常一样,您可以使用输入和输出重定向和管道来读取或写入文件和其他进程。

如果你想保留最后一个换行符,可以用echoprintf '\n'简单地添加它,例如:

 cat file1 file2... | { tr -d '\n'; echo; } > output.txt 

很多种方法。 为了说明,我已将您的示例保存在file

 $ cat file | tr -d '\n' abcdefqwerty$ $ cat file | perl -pe 's/\n//' abcdefqwerty$ 

这将删除所有换行符,包括最后一个。 你可能想做:

 $ printf "%s\n" "$(cat file | perl -pe 's/\n//')" abcdefqwerty $ printf "%s\n" "$(cat file | tr -d '\n')" abcdefqwerty 

您可以通过awk管道多线输出

 awk '{printf "%s",$0} END {print ""}' 

或使用sed

 sed ':a;N;$!ba;s/\n//g' 

示例运行

 $ echo -e "1\n2\n3\n4" | awk '{printf "%s",$0} END {print ""}' 1234 $ echo -e "1\n2\n3\n4" | sed ':a;N;$!ba;s/\n//g' 1234 

进一步阅读: 使用AWK·serverfault.SE删除换行符

还有your_command | paste -sd '' your_command | paste -sd ''保留尾随换行符。

如果你想为此使用Perl,你可以使用它的chomp函数:

 perl -pe chomp 

更多细节,对于那些感兴趣的人。

您可以将一个或多个文件名作为后续参数传递。

 perl -pe chomp file1 file2 file3 

在某些情况下,您可能不想这样做 ,但您可以管道或重定向到该命令。 (这些能力 – 以及警告 – 也适用于任何其他perl -pperl -n解决方案。)

所以,如果你想处理运行some-command输出:

 some-command | perl -pe chomp 

这可能比terdon的答案中的Perl命令更快。 在这种情况下,换行符(由\n表示)仅出现在行的末尾 – 因为它们是Perl用来决定每行结束的位置。 s/\n//在整行中搜索换行符,而chomp只删除末尾的那行(如果有的话,因为最后一行可能有也可能没有)。

性能可能不是真正喜欢chomp主要原因。 除非你正在处理一个包含很长行的大文件,否则terdon的答案中的perl命令只会稍微慢一些。 如果你需要速度, David Foerster的方式仍然可能更快。 但是,如果你使用Perl, chomp是完全正确的工具,我认为chomp的意图比s/\n//更清晰。 最终,对于哪个更好,可能没有客观的答案。

打印最终换行符。

但是,我建议不要使用命令替换( $( ) )来确保打印尾随换行符。 除非您处理的文本很短,否则可能会很慢 – 它必须立即收集所有文本然后打印 – 这会使您的命令更难理解。 相反,你可以像David Foerster建议的那样,然后运行echoprintf '\n'

 perl -pe chomp; echo 

如果你是 (或者像David Foerster所示) 该命令重定向的管道,那么你可以将它包含在{ ;}以便将两个命令的输出结合在一起。 如果您只是将其打印到终端,那么您可以完全按照上面所示运行它。 即使您正在管道或重定向命令,这也有效,因为echo / printf '\n'实际上并不读取任何输入。 也就是说,这有效:

 some-command | perl -pe chomp; echo 

在这里你不能简单地删除{ ;}

 { perl -pe chomp; echo; } | some-other-command 

或者,如果您愿意,可以将perl打印成最终的换行符。 就像在{ ;}包含perlecho命令一样,这种方法即使你正在管道或重定向也是有效的(并且,就像所有方法一样,当你管道它也可以工作):

 perl -wpe 'chomp; END { print "\n" }' 

请注意,terdon的答案中的命令也适用于打印最终换行符的这些方法。 例如:

 perl -pe 's/\n//'; echo 
 perl -pe 's/\n//; END { print "\n" }' 

使用shell-only方式:

 while IFS= read -r line || [ -n "$line" ]; do printf "%s" "$line"; done < inputfile.txt 

这个答案解决了你想要创建的问题: 为什么bash在$(cat文件)中删除\ n?

如果你输入cat myfile.txt你会看到:

 abc def ghi 

但是如果你键入echo $(cat myfile.txt)你会看到:

 abc def ghi 

请注意,此方法会插入一个空格,其中包含以前单独的新行。 这使输出更容易阅读,但不严格遵守您的问题范围。

如果您使用Bash,那么您可以在没有任何外部工具的情况下完成。

 x=($(echo line1; echo line2)) echo "${x[@]}" 

结果:

 line1 line2 

第一个命令将多行输出转换为数组,第二个命令将数组展开为一行上的多个参数。