如果我运行命令cat file | grep pattern
,我会得到很多输出行。如何将所有行连接成一行,有效地用"\n"
替换每个"\" "
(以"
结尾,后跟空格)?
cat file | grep pattern | xargs sed s/\n/ /g
对我不起作用。
答案 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 | xargs
。 xargs
输出的默认限制为~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)
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)
这使我只记录了一条文件的所有记录。