在将grep与上下文行一起使用时,如何摆脱" - "行分隔符?

Mic*_*ael 57 grep

我有一个名为compare.txt的文本文件,我想提取包含模式"nmse_gain_constant"的每一行后面的单行.以下命令让我关闭:

grep -A 1 nmse_gain_constant compare.txt | grep -v nmse_gain_constant
Run Code Online (Sandbox Code Playgroud)

但是这包括每行所需文本之间的分隔符" - "行.任何简单的想法如何摆脱" - "线?

我在这里给你一些示例文本,但是这个网页帖子错误地将" - "字符解释为控制字符,你会看到的不正确.

Eri*_*sty 86

我这样做:

 grep ... | grep -v -- "^--$"
Run Code Online (Sandbox Code Playgroud)

但这也有效!

grep --no-group-separator ...
Run Code Online (Sandbox Code Playgroud)

并且它不会吐出" - "甚至是空白行.

  • Mac OS X上的`grep:unrecognized选项'--no-group-separator'` (12认同)
  • 对于 Mac OS X,您可以使用“brew”安装各种命令行工具的 Gnu 版本;这包括`grep`。我相信默认情况下它安装为“ggrep”(Gnu Grep)。这支持“--no-group-separator”选项。我已经这样做了并且有效。请参阅此链接作为参考[如何在 macOS 中安装和使用 GNU Grep](https://apple.stackexchange.com/questions/193288/how-to-install-and-use-gnu-grep-in-macos# :~:text=104-,GNU,-grep%20is%20not) (2认同)

小智 24

有一个未记录的grep参数:" - group-separator",它会覆盖默认的" - ".您可以将其设置为""以摆脱双破折号.虽然,你仍然得到一个空行.我遇到了同样的麻烦,通过阅读grep的源代码找到了这个参数.

  • 你可以使用--no-group-separator(见下文) (9认同)
  • mac 上没有这样的选项用于`grep (BSD grep) 2.5.1-FreeBSD` (2认同)

Edd*_*die 20

好吧,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.
Run Code Online (Sandbox Code Playgroud)

但是你可以使用一个简单的sed来清理结果:

yourgrep | sed '/^--$/d'
Run Code Online (Sandbox Code Playgroud)


gho*_*g74 8

如果使用AWK,则无需使用如此多的greps或使用其他工具(例如,sed):

awk '/nmse_gain_constant/{getline;print }' compare.txt
Run Code Online (Sandbox Code Playgroud)

  • 对于grep -B使用:awk'/ regex/{print x; 打印}; {x = $ 0}' (2认同)

Ami*_*shk 6

一种解决方案是:

grep -A 1 nmse_gain_constant compare.txt | grep -v nmse_gain_constant  | grep -v "\-\-"
Run Code Online (Sandbox Code Playgroud)

  • 不必要的引用和转义:使用 `...| 更简单 grep -v -- --` (2认同)