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

T. *_*ter 126 unix linux bash grep tr

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

cat file | grep pattern | xargs sed s/\n/ /g 不适合我.

Chr*_*our 187

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

$ grep pattern file | tr '\n' ' '
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

$ grep pattern file | awk '{print}' ORS='" '
Run Code Online (Sandbox Code Playgroud)

这会改变:

one
two 
three
Run Code Online (Sandbox Code Playgroud)

至:

one" two" three" 
Run Code Online (Sandbox Code Playgroud)

  • 这效果很好,但是我不希望分隔符出现在最后一个条目上。例如,根据您的“”,它显示为“一”二“三”`,但是我希望它显示为“一”二“三”。请注意,最后三个没有括号。有任何想法吗? (4认同)
  • 通过这种方法,你最终会得到一个不受欢迎的空间. (3认同)
  • 您需要在末尾添加 `echo ""` 以在提示文本之前添加新行。 (2认同)
  • @oink您可以将结果通过管道传递到sed'$ s /..$//'中,以删除最后一行的最后2个字符。 (2认同)
  • 如果您不希望换行,请使用--delete选项,因为默认情况下需要两个参数。例如`tr --delete'\ n'`。 (2认同)

blu*_*dge 57

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

grep pattern file | xargs
Run Code Online (Sandbox Code Playgroud)

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

  • 该解决方案还具有以下优点:它从输入中"占用"空间.+1 (2认同)

小智 47

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

echo $(cat file)
Run Code Online (Sandbox Code Playgroud)

  • 严重低估的答案在这里,这很简单,就像一个魅力,也有一个尾随的换行符. (6认同)
  • 或者只是`echo $(<file)`...使用echo不仅比使用`tr'\n'''更整洁,而且更好(想想`\ r \n`行结尾).@aggsol你可以说'IFS = $'\n\t'` (4认同)

seh*_*ehe 18

这可能是你想要的

cat file | grep pattern | paste -sd' '
Run Code Online (Sandbox Code Playgroud)

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

cat file | grep pattern | paste -sd'~' | sed -e 's/~/" "/g'
Run Code Online (Sandbox Code Playgroud)

(这假定~不会发生file)

  • @Stephan没有必要假设`cat file`实际上是`cat`,甚至是文件.(我只是保留了那部分,因为它与问题无关) (2认同)

Ric*_*mes 11

这是一个生成由逗号分隔的输出的示例。您可以用您需要的任何分隔符替换逗号。

cat <<EOD | xargs | sed 's/ /,/g'
> 1
> 2
> 3
> 4
> 5
> EOD
Run Code Online (Sandbox Code Playgroud)

产生:

1,2,3,4,5
Run Code Online (Sandbox Code Playgroud)


sim*_*eco 8

我知道解决这个问题的最快和最简单的方法:

当我们想用空格替换换行符 时:\n

xargs < file
Run Code Online (Sandbox Code Playgroud)

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

当我们想要用另一个恰好一个字符替换一个字符时:

tr '\n' ' ' < file
Run Code Online (Sandbox Code Playgroud)

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

tr '\n' '~' < file | sed s/~/many_characters/g
Run Code Online (Sandbox Code Playgroud)

首先,我们将换行符替换\n为波形符~(或选择文本中不存在的另一个唯一字符),然后用任何其他字符 ( many_characters) 替换波形符字符,并对每个波形符 (flag ) 执行此操作g


asc*_*nts 8

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

# cat > file.txt
a
b
c

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

另外,如果您的文件有列,这提供了一种仅连接某些列的简单方法:

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

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


JoL*_*JoL 6

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

sed ':b;N;$!bb;s/\n/ /g'
Run Code Online (Sandbox Code Playgroud)

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

这还允许您使用除空格之外的其他连接字符串,例如逗号等,这是xargs不能执行的操作:

$ seq 1 5 | sed ':b;N;$!bb;s/\n/,/g'
1,2,3,4,5
Run Code Online (Sandbox Code Playgroud)