如何在同一行上打印多行输出?
有没有方法在同一行上打印多行输出(单输出)?
例如,如果输出为:
abc def qwerty
是否可以打印:
abcdefqwerty
您可以使用tr -d
从给定集中删除所有出现的字符。 要删除换行符,请使用:
tr -d '\n'
与往常一样,您可以使用输入和输出重定向和管道来读取或写入文件和其他进程。
如果你想保留最后一个换行符,可以用echo
或printf '\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 -p
或perl -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建议的那样,然后运行echo
或printf '\n'
。
perl -pe chomp; echo
如果你是从 (或者像David Foerster所示) 从该命令重定向的管道,那么你可以将它包含在{
;}
以便将两个命令的输出结合在一起。 如果您只是将其打印到终端,那么您可以完全按照上面所示运行它。 即使您正在管道或重定向到命令,这也有效,因为echo
/ printf '\n'
实际上并不读取任何输入。 也就是说,这有效:
some-command | perl -pe chomp; echo
在这里你不能简单地删除{
;}
:
{ perl -pe chomp; echo; } | some-other-command
或者,如果您愿意,可以将perl
打印成最终的换行符。 就像在{
;}
包含perl
和echo
命令一样,这种方法即使你正在管道或重定向也是有效的(并且,就像所有方法一样,当你管道时它也可以工作):
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
第一个命令将多行输出转换为数组,第二个命令将数组展开为一行上的多个参数。