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


Answers:


13

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

tr -d '\n'

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

如果要保留最后一个换行符,只需使用echo或将其添加回去printf '\n',例如:

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

10

很多方法。为了说明,我将您的示例保存在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

我认为printf+ cat+ perl组合可以通过“ perl -pe 's/\n//;END{printf "\n"}' input.txt 单进程” 更好地处理,没有命令替换和引号引起的混乱,也没有UUOC。也许。
Sergiy Kolodyazhnyy

7

您可以通过管道传输多行输出 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删除换行符



2

如果要为此使用Perl,则可以使用其chomp功能:

perl -pe chomp

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

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

perl -pe chomp file1 file2 file3

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

因此,如果要处理正在运行的输出some-command

some-command | perl -pe chomp

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

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

打印最终换行符。

但是,我建议不要使用命令替换($( )),以确保打印尾随的换行符。除非您要处理的文本很短,否则这可能会很慢-它必须立即收集所有文本然后打印出来-这会使您的命令更难以理解。相反,你可以做大卫福斯特建议和运行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" }'

perl -wpe 'chomp; END { print "\n" } 是相同的过程,相对于添加尾随回波来说是次要的优势
Sergiy Kolodyazhnyy


1

此答案可以解决您尝试创建的问题:为什么bash会删除$(cat文件)中的\ n?

如果输入,cat myfile.txt您将看到:

abc
def
ghi

但是,如果键入,echo $(cat myfile.txt)您将看到:

abc def ghi

请注意,此方法在以前使用单独的新行的位置插入一个空格。这使输出更易于阅读,但并不严格遵守您的问题范围。


0

如果您使用的是Bash,则无需任何外部工具即可完成。

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

结果:

line1 line2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.