如何在grep中使用多行作为组分隔符?


9

在中,grep您可以用来--group-separator在小组比赛之间写一些东西。

这很容易弄清楚我们有哪些块,尤其是在使用-C Xoption获取上下文行时。

$ cat a
hello
this is me
and this is
something else
hello hello
bye
i am done
$ grep -C1 --group-separator="+++++++++" 'hello' a
hello
this is me
+++++++++
something else
hello hello
bye

我在grep使用空行作为上下文“ group-separator”来学习grep的方法,就是说只有一个空行--group-separator=""

但是,如果我想有两个空行怎么办?我试着说,--group-separator="\n\n"但我得到字面值\ns:

$ grep -C1 --group-separator="\n\n" 'hello' a
hello
this is me
\n\n
something else
hello hello
bye

其他类似的方法--group-separator="\nhello\n"也不起作用。

Answers:


12

哦,我找到了,我只需要使用$''语法而不是$""

$ grep -C1 --group-separator=$'\n\n' 'hello' a
hello
this is me



something else
hello hello
bye

来自man bash

报价

$'string'形式的单词经过特殊处理。该单词扩展为字符串,并按ANSI C标准的规定替换反斜杠转义字符。反斜杠转义序列(如果存在)的解码方式如下:

(...)
\n     new line

1

我建议使用echo -eprintf\\n换行符。

示例(带有echo -e):

$ grep -C1 --group-separator="$(echo -e line1\\n\\nline2)" 'hello' a
hello
this is me
line1
line2
something else
hello hello
bye

示例(带有printf):

$ grep -C1 --group-separator="$(printf hello\\nfedorqui)" 'hello' a
hello
this is me
hello

fedorqui
something else
hello hello
bye

优势之一是我们使用双引号。(因此会进行变量扩展等)


我认为没有必要使用printfecho。就您而言,grep -C1 --group-separator=$'hello\nfedorqui' 'hello' a是等效的。
fedorqui

@fedorqui是的,让我删除多余的答案!
潘迪2015年

但是,感谢您的努力,如果我还没有找到$''您,那将是一个不错的选择!
fedorqui

@fedorqui顺便说一句,我发现失败了$'$var'(如果用单引号设置,则无法扩展/打印变量的值!)对吗?而"$(echo $var)"可以工作。
潘迪2015年

是的,这是正确的。但是你可以说$'"$var"'。那是$'+ "$var"+ '
fedorqui
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.