217

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

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

4

11 回答 11

322

用于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" 
于 2013-03-22T21:31:18.233 回答
98

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

grep pattern file | xargs

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

于 2014-08-11T20:35:10.970 回答
90

在不带引号的 bashecho中删除回车、制表符和多个空格

echo $(cat file)
于 2015-11-05T09:11:12.343 回答
24

这可能是你想要的

cat file | grep pattern | paste -sd' '

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

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

(这假设~不会发生在file

于 2013-03-22T21:41:31.477 回答
11

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

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

产生:

1,2,3,4,5
于 2018-08-02T12:26:20.123 回答
7

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

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

xargs < file

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

当我们想用另一个字符替换一个字符时

tr '\n' ' ' < file

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

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

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

于 2020-02-06T18:55:32.877 回答
5

我喜欢这个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
于 2020-08-03T13:23:42.530 回答
4

这是使用ex编辑器Vim的一部分)的方法:

  • 加入所有行并打印到标准输出:

    $ ex +%j +%p -scq! file
    
  • 就地加入所有行(在文件中):

    $ ex +%j -scwq file
    

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

于 2016-12-20T22:19:26.240 回答
3

这是另一个使用的简单方法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
于 2020-07-23T15:15:08.863 回答
0

可能最好的方法是使用“awk”工具,它将生成输出到一行

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

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

于 2018-03-12T11:22:37.653 回答
-1

在 red hat linux 上,我只使用 echo :

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

这给了我一个文件的所有记录在一行上。

于 2020-05-08T12:30:35.773 回答