如何将多行输出连接到一行?

时间:2013-03-22 21:27:52

标签: linux bash unix grep tr

如果我运行命令cat file | grep pattern,我会得到很多输出行。如何将所有行连接成一行,有效地用"\n"替换每个"\" "(以"结尾,后跟空格)?

cat file | grep pattern | xargs sed s/\n/ /g 对我不起作用。

11 个答案:

答案 0 :(得分:152)

使用tr '\n' ' '将所有换行符转换为空格:

$ grep pattern file | tr '\n' ' '

注意:grep读取文件,cat连接文件。不要cat file | grep

修改

tr只能处理单字符翻译。您可以使用awk更改输出记录分隔符,如:

$ grep pattern file | awk '{print}' ORS='" '

这会改变:

one
two 
three

为:

one" two" three" 

答案 1 :(得分:47)

将输出管道输出到xargs会将每行输出连接到带有空格的单行:

grep pattern file | xargs

或任何命令,例如。 ls | xargsxargs输出的默认限制为~4096个字符,但可以通过例如增加。 xargs -s 8192

答案 2 :(得分:35)

在没有引号的bash echo中删除回车符,制表符和多个空格

echo $(cat file)

答案 3 :(得分:17)

这可能是你想要的

cat file | grep pattern | paste -sd' '

关于你的编辑,我不确定这意味着什么,也许是这个?

cat file | grep pattern | paste -sd'~' | sed -e 's/~/" "/g'

(这假设~

中没有出现file

答案 4 :(得分:3)

我知道解决此问题的最快,最简单的方法:

当我们要将换行符替换为{strong> \n 时:

xargs < file

xargs对于每行的字符数和组合的所有字符数都有自己的限制,但是我们可以增加它们。可以通过运行以下命令找到详细信息:xargs --show-limits,当然也可以在手册中找到:man xargs

当我们要将一个字符替换为另一个字符时:

tr '\n' ' ' < file

当我们要用多个字符替换一个字符时:

tr '\n' '~' < file | sed s/~/many_characters/g

首先,将换行符\n替换为波浪号~(或选择文本中不存在的另一个唯一字符),然后将波浪号字符替换为其他任何字符({{1 }}),我们对每个波浪号(标志many_characters)进行操作。

答案 5 :(得分:2)

这是一个产生用逗号分隔输出的示例。您可以使用所需的任何分隔符来替换逗号。

cat <<EOD | xargs | sed 's/ /,/g'
> 1
> 2
> 3
> 4
> 5
> EOD

产生:

1,2,3,4,5

答案 6 :(得分:2)

这是使用awk的另一种简单方法:

# cat > file.txt
a
b
c

# cat file.txt | awk '{ printf("%s ", $0) }'
a b c

此外,如果您的文件包含列,这将提供一种简单的方法来仅连接某些列:

# cat > cols.txt
a b c
d e f

# cat cols.txt | awk '{ printf("%s ", $2) }'
b e

答案 7 :(得分:2)

我喜欢xargs解决方案,但是如果不折叠空间很重要,那么可以改做:

sed ':b;$!{N;bb};s/\n/ /g'

这将替换空格的换行符,而不会像tr '\n' ' '那样替换最后的行终止符。

这还允许您使用除空格以外的其他连接字符串,例如逗号等,xargs无法做到的事情:

$ seq 1 5 | sed ':b;$!{N;bb};s/\n/,/g'
1,2,3,4,5

答案 8 :(得分:1)

以下是使用ex editorVim的一部分)的方法:

  • J 所有行, p rint到标准输出:

    $ ex +%j +%p -scq! file
    
  • J oin in line(在文件中):

    $ ex +%j -scwq file
    

    注意:这将连接文件内部的所有行!

答案 9 :(得分:1)

最好的方法可能就是使用&#39; awk&#39;将输出生成一行的工具

$ awk ' /pattern/ {print}' ORS=' ' /path/to/file

它会将所有行合并为一个带空格分隔符的行

答案 10 :(得分:-1)

在红帽linux上,我只使用echo:

回显$(cat / some / file / name)

这使我只记录了一条文件的所有记录。