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

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

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

352923 次浏览

使用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"

这可能就是你想要的

cat file | grep pattern | paste -sd' '

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

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

(这假设~不会出现在file中)

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

grep pattern file | xargs

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

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

echo $(cat file)

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

  • __abco0oin所有行和print到标准输出:

    $ ex +%j +%p -scq! file
    
  • Join all lines in-place (in the file):

    $ ex +%j -scwq file
    

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

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

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

它将使用空格分隔符将所有行合并为一行

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

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

生产:

1,2,3,4,5

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

当我们想要替换新的行字符 \n 有了空间:

xargs < file

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

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

tr '\n' ' ' < file

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

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

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

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

Echo $(cat /some/file/name)

这将在一行中给出文件的所有记录。

下面是另一个使用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

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

paste -sd'~'给出错误。

下面是我使用bash在mac上工作的方法

cat file | grep pattern | paste -d' ' -s -

from man paste

-d list     Use one or more of the provided characters to replace the newline characters instead of the default tab.  The characters
in list are used circularly, i.e., when list is exhausted the first character from list is reused.  This continues until
a line from the last input file (in default operation) or the last line in each file (using the -s option) is displayed,
at which time paste begins selecting characters from the beginning of list again.


The following special characters can also be used in list:


\n    newline character
\t    tab character
\\    backslash character
\0    Empty string (not a null character).


Any other character preceded by a backslash is equivalent to the character itself.


-s          Concatenate all of the lines of each separate input file in command line order.  The newline character of every line
except the last line in each input file is replaced with the tab character, unless otherwise specified by the -d option.
If ‘-’ is specified for one or more of the input files, the standard input is used; standard input is read one line at a time,

循环地,对于每个' - '的实例。