我该如何摆脱“我该怎么做?”--&引用;将grep与上下文行一起使用时的行分隔符?

我该如何摆脱“我该怎么做?”--&引用;将grep与上下文行一起使用时的行分隔符?,grep,Grep,我有一个名为compare.txt的文本文件,我想在其中提取包含模式nmse\u gain\u常量的每一行后面的单行。以下命令使我接近: grep -A 1 nmse_gain_constant compare.txt | grep -v nmse_gain_constant 但这包括在每行所需文本之间的分隔符--行。如何摆脱--行 示例:对于如下所示的输入文件 line line nmse_gain_constant matching line line after first match

我有一个名为
compare.txt
的文本文件,我想在其中提取包含模式
nmse\u gain\u常量的每一行后面的单行。以下命令使我接近:

grep -A 1 nmse_gain_constant compare.txt | grep -v nmse_gain_constant
但这包括在每行所需文本之间的分隔符
--
行。如何摆脱
--

示例:对于如下所示的输入文件

line
line
nmse_gain_constant matching line
line after first match
line
line
nmse_gain_constant another matching line
line after second match
line
nmse_gain_constant a third matching line
line after third match
输出是

line after first match
--
line after second match
--
line after third match
但是我想要一个

line after first match
line after second match
line after third match
一个解决办法是:

grep -A 1 nmse_gain_constant compare.txt | grep -v nmse_gain_constant  | grep -v "\-\-"

默认情况下,
A
开关会添加这些字符,所以这并不神秘

man grep
声明:

-A NUM

    Places  a  line  containing  a  group  separator  (--)   between
    contiguous  groups  of  matches.  With the -o or --only-matching
    option, this has no effect and a warning is given.
但您可以使用简单的sed来清理结果:

yourgrep | sed '/^--$/d'

如果您使用AWK,则无需通过管道连接到如此多的GREP或使用其他工具(例如,sed):

awk '/nmse_gain_constant/{getline;print }' compare.txt

grep有一个未记录的参数:“--group separator”,它覆盖默认的“-”。您可以将其设置为“”以摆脱双破折号。尽管如此,您仍然会收到一条空行。我也遇到了同样的问题,通过阅读grep的源代码找到了这个参数。

我这样做:

 grep ... | grep -v -- "^--$"
但这也很有效(在许多操作系统上,而不是所有操作系统上)


而且它不会吐出“-”甚至一个空行。

对于grep-B用法:awk'/regex/{print x;print};{x=$0}'getline的解释;awk命令的打印部分适合这个答案,因为大多数在应该使用awk时尝试grep的人不熟悉用于获得grep等效结果的awk表达式。您可以使用--no group separator(请参见下文),即使我设置了
--group separator=“”
,组分隔符实际上并不是空的,但仍然会上色。因此,分隔符行不是空行,而是包含颜色代码,即
[[36m[[K[[K[[K
。有没有办法禁用分隔符的着色,同时保持grep
--color=always
?mac上没有用于
grep(BSD grep)的此类选项2.5.1-FreeBSD
我可以确认Tim的陈述-我有相同版本的grep,但它不可用。@eddie搜索时需要一个
标志来查找此人正在查找的内容。通常情况下,您是在查找“其他内容后的行”
grep:unrecognized option'--no group separator'
在Mac OS Xin上不添加额外的grep,只需删除
A
标志
--所有版本的
grep
不支持无组分隔符的引用和转义:使用
更简单,
grep-v--
Regexp with
sed
结束kill执行此任务。为什么不使用
grep-v--
?-A不仅仅添加“--”,它还会在匹配后打印额外的NUM行。类似地,-B在匹配前打印NUM行,而-C从匹配周围打印上下文的NUM行。添加“--”以分隔组。
grep --no-group-separator ...