如果我运行命令cat文件| grep pattern,我将得到许多行输出。如何将所有行连接成一行,有效地将每个“\n”替换为“\”(以“”结尾,后面加空格)?

Cat文件| grep模式| xargs sed s/\n/ /g 对我没用。


当前回答

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

echo $(cat file)

其他回答

这可能就是你想要的

cat file | grep pattern | paste -sd' '

至于你的编辑,我不确定是什么意思,也许是这个?

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

(这里假设~不会出现在文件中)

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

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

xargs < file

Xargs对每行字符数和所有字符的总和有自己的限制,但我们可以增加这些限制。详细信息可以通过运行命令:xargs——show-limits和手册:man xargs找到

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

tr '\n' ' ' < file

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

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

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

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

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

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

编辑:

Tr只能处理单个字符的转换。您可以使用awk更改输出记录分隔符,如下所示:

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

这将转化为:

one
two 
three

to:

one" two" three" 

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

grep pattern file | xargs

或任何命令。Ls | xargs。xargs输出的默认限制是~4096个字符,但是可以使用eg来增加。Xargs -s 8192。

Grep Xargs

我喜欢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