我该如何摆脱“我该怎么做?”--&引用;将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 withsed
结束kill执行此任务。为什么不使用grep-v--
?-A不仅仅添加“--”,它还会在匹配后打印额外的NUM行。类似地,-B在匹配前打印NUM行,而-C从匹配周围打印上下文的NUM行。添加“--”以分隔组。
grep --no-group-separator ...