如何在一行中“合并”模式?


10

我正在做grep和sed,我得到了我感兴趣的文件的2行。如何在以新行字符结尾的一行中获得这些行?
现在我得到:

pattern1  
pattern2  

我想得到 pattern1 pattern2 \n


1
您可以共享更多示例数据吗?
slm

使用 printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'
Valentin Bajrami 2014年

如果您打算将多行输出合并为一个,则“粘贴”是作业的工具。
slm

任何特定的工具?您打算如何做?
Braiam

Answers:


7

paste

{...pipeline...} | paste -d " " - -

那就是说:“从stdin(第一个-)中读取一行,从stdin(第二个-)中读取另一行,然后在它们之间加一个空格”


bash特定的技术:

$ x=$(grep -o pattern. test.txt)
$ echo "$x"
pattern1
pattern2
$ mapfile -t <<< "$x"
$ echo "${MAPFILE[*]}"
pattern1 pattern2

参考:http : //www.gnu.org/software/bash/manual/bashref.html#index-mapfile


什么- -啊 这样的命令吗?
2014年

@Jim-是的,没错。那些告诉paste我们您希望它如何处理输入。一次2个。一次添加更多内容以执行3。seq 10 | paste -d " " - -
slm

6

我将三种不同方式的方法放在一起

AWK

printf %s\\n pattern1 pattern2 | awk -vRS="\n" -vORS=" " '1; END {print RS}'

SED

printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'

TR

printf %s\\n pattern1 pattern2 | tr '\n' ' '; echo

还有更多。


tr解决方案将吞下结束换行,所以你可能要添加; echo到一个
格伦·杰克曼

@glennjackman啊对了!感谢您的提示。您可以随意修改答案。我错过了!
Valentin Bajrami 2014年

2

您可以使用Shell脚本或在命令行中执行此操作,只需将命令的输出放入变量中即可echo

# x=$(grep -e "pattern1\|pattern2" test)
# printf '%s\n' "$x"
pattern1 pattern2

如果不加引号,则该变量也会进行文件名扩展,因此,如果结果中包含任何全局字符(例如*?),则值可能会更改。
glenn jackman 2014年

@glennjackman,感谢您提及此问题,我们如何解决此问题?
2014年

@Networker不使用反引号,但$()不是..和用printfprintf '%s\n' "$x"
瓦伦丁巴伊拉米

我希望printf '%s\n' "$x"不会删除“内部”换行符。
glenn jackman 2014年

2

使用sed,您可以执行以下操作:

<your previous commands> | sed '{N; s/\n/ /}'
  • N;告诉sed将下一行添加到模式空间中,因此现在sed可以同时使用这两行。
  • s/\n/ / 用空格替换换行符,将两行“合并”在一起。

2

一种简单的方法,将管道输出到xargs

$ echo -e 'a\nb' | xargs
a b

这仅适用于小输出,因为它受每个命令行的最大字符数限制。最大值取决于系统,您可以使用获得该值getconf ARG_MAX


1
( set -f; IFS='
'; printf '%s %s\n' $(grepcmd <input)
) >output

如果您愿意,IFS会很乐意吃的。


-1

将您的sed / grep放在反引号中

当您的原始命令是:

grep -i 'foo' mylog.log | sed 's/bar/baz/gi'

您的新命令将是:

`grep -i 'foo' mylog.log | sed 's/bar/baz/gi'`

不会在行与行之间留出空格,但是您可以始终固定在另一个sed管道上:

 | sed 's/$/ /'

1
嗯不 这将执行 sed命令的输出。
glenn jackman 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.