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

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

grep可以--group-separator在小组比赛之间写一些东西。

这可以方便地明确我们有哪些块,特别是在使用-C X选项获取上下文行时。

$ 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="".

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

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

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

答案1

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

$ 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

答案2

我建议使用echo -e或者printf\\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

一个优点是我们正在使用双引号。 (因此变量扩展等起作用)

相关内容