【问题标题】:Can grep show matching part of line with "context"? [duplicate]grep 可以显示与“上下文”匹配的部分行吗? [复制]
【发布时间】:2019-08-29 13:04:30
【问题描述】:

假设我有这个文本文件 (lorem.txt):

Lorem ipsum dolor sit amet, consectetur
adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna
aliqua.

如果我使用grep,我现在可以通过以下方式轻松找到包含eiusmod 的行:

$ grep eiusmod lorem.txt
adipiscing elit, sed do eiusmod tempor

通过使用某种上下文切换,如-C,我什至可以得到匹配周围的线条:

$ grep -C1 eiusmod lorem.txt
Lorem ipsum dolor sit amet, consectetur
adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna

这很好。但是如果我只想在同一行中查看最接近匹配项的一些字符怎么办?不是整行。所以像这样的行为:

$ grep --char-context=3 eiusmod lorem.txt
do eiusmod te
$ grep -n --char-context=5 dol lorem.txt
1:psum dolor si
3:e et dolore m

我当然可以使用一些聪明的 sed、awk 或其他工具来做到这一点:

$ sed -n '/dol/{=;s/.*\(...dol...\).*/\1/p}' lorem.txt | sed 'N;s/\n/:o/'
1:um dolor 
3:et dolore

但这不是我想要的。它过于复杂和晦涩,无法在日常使用中使用。那么有没有更简单的方法或工具来实现这一点?

这主要是在对带有长行的文件(如缩小的 css)或其他带有长文本但没有换行符的文件执行递归 grep 时出现的问题。我是在使用git grep 时开始考虑这个问题的,因此首选可用于普通grepgit grep 的解决方案。

请注意另外,grep-pipe-sed 构造是不可取的,因为它会删除匹配的任何突出显示/着色。

【问题讨论】:

  • 我怀疑您询问范围量词,例如grep -o '.\{0,3\}eiusmod.\{0,3\}' lorem.txt,见this grep demo
  • 我之前没有找到-o 选项。完美的。它对我来说足够近了。但我认为它不适用于git grep
  • @UlfR Wiktor 的建议在两边打印匹配和三个上下文字符。这怎么不是你想要的?哦,我明白了,您希望上下文不被着色!
  • grep -o '.\{0,3\}eiusmod.\{0,3\}' | grep --color eiusmod 怎么样?
  • 你试过git grep -E --all-match '.{0,3}eiusmod.{0,3}' lorem.txtgit grep -E --all-match '.{0,3}eiusmod.{0,3}' lorem.txt | grep --color eiusmod吗?

标签: git sed grep


【解决方案1】:
grep -noE '.{,4}dolor.{,4}' lorem.txt

返回:

1:sum dolor sit
3: et dolore ma

【讨论】:

    【解决方案2】:

    基于上述 Wiktor Stribiżew 评论的解决方案。

    可以创建“grep-cxt”,它将采用 2 个强制参数(模式、模式周围的字符数)和可选的文件列表(默认值:stdin)。

    #! /bin/bash
    count=$1
    pattern=$2
    shift
    shift
    grep -E --all-match ".{0,$count}$pattern.{0,$count}" "$@"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      相关资源
      最近更新 更多