grep可以显示与“上下文”匹配的行的一部分吗?

时间:2019-08-29 13:04:30

标签: git sed grep

说我有这个文本文件(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构造是不可取的,因为这会删除匹配项的任何突出显示/着色。

2 个答案:

答案 0 :(得分:1)

grep -noE '.{,4}dolor.{,4}' lorem.txt

它返回:

1:sum dolor sit
3: et dolore ma

答案 1 :(得分:0)

基于上述Wiktor Stribiewew评论的解决方案。

可能会创建'grep-cxt',它将带有2个强制性参数(模式,模式周围的字符数)和可选文件列表(默认值:stdin)。

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