Answers:
您可以通过管道传输多行输出 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
如果要为此使用Perl,则可以使用其chomp
功能:
perl -pe chomp
您可以传递一个或多个文件名作为后续参数。
perl -pe chomp file1 file2 file3
在某些情况下,您可能不想这样做,但是可以通过管道传递或重定向到该命令。(这些能力以及该警告同样适用于任何其他解决方案perl -p
或perl -n
基础解决方案。)
因此,如果要处理正在运行的输出some-command
:
some-command | perl -pe chomp
这可能比terdon's answer中的Perl命令更快。\n
在这种情况下,换行符(用表示)仅出现在行的末尾,因为Perl使用它们来决定每行的结尾。s/\n//
在整行中搜索换行符,而chomp
只删除最后一行(如果有的话,因为最后一行可能有也可能没有)。
性能可能并不是真正喜欢它的主要原因chomp
。除非您正在处理行很长的大文件,否则terdon答案中的 perl
命令只会稍微慢一些。而且,如果您需要速度,David Foerster的方法可能仍会更快。但是,如果您使用的是Perl,则是完全正确的工具,而且我认为的意图比的意图更清晰。最终,关于哪个更好,可能没有客观答案。chomp
chomp
s/\n//
但是,我建议不要使用命令替换($(
)
),以确保打印尾随的换行符。除非您要处理的文本很短,否则这可能会很慢-它必须立即收集所有文本然后打印出来-这会使您的命令更难以理解。相反,你可以做大卫福斯特建议和运行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" }'
perl -wpe 'chomp; END { print "\n" }
是相同的过程,相对于添加尾随回波来说是次要的优势
使用仅shell方式:
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
请注意,此方法在以前使用单独的新行的位置插入一个空格。这使输出更易于阅读,但并不严格遵守您的问题范围。
printf
+cat
+perl
组合可以通过“perl -pe 's/\n//;END{printf "\n"}' input.txt
单进程” 更好地处理,没有命令替换和引号引起的混乱,也没有UUOC。也许。