grep能否显示带“上下文”的匹配部分?

6

假设我有一个文本文件(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 时开始思考这个问题, 所以希望找到既可用于普通的 grep 又可用于 git grep 的解决方案。

注意grep-pipe-sed 结构是不理想的,因为这将删除任何匹配项的高亮/着色。


7
我猜您询问的是范围量词,例如 grep -o '.\{0,3\}eiusmod.\{0,3\}' lorem.txt,请参见grep 演示 - Wiktor Stribiżew
我之前没有找到-o选项。很好。对我来说足够接近了。但是我认为它在git grep上不起作用。 - UlfR
@UlfR,Wiktor的建议会打印出匹配项及其前后三个字符的上下文。这不是你想要的吗?哦,我明白了,你希望上下文没有颜色! - joanis
5
这条命令是对文本进行匹配,输出其中包含"eiusmod"的字符串,并在匹配到的字符串前后各显示3个字符。您可以尝试使用以下命令:grep -o '.\{0,3\}eiusmod.\{0,3\}' | grep --color eiusmod - joanis
1
你尝试过使用 git grep -E --all-match '.{0,3}eiusmod.{0,3}' lorem.txt 或者 git grep -E --all-match '.{0,3}eiusmod.{0,3}' lorem.txt | grep --color eiusmod 吗? - Wiktor Stribiżew
显示剩余2条评论
2个回答

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

它返回:
1:sum dolor sit
3: et dolore ma

1

根据Wiktor Stribiżew上面的评论提供的解决方案。

可以创建“grep-cxt”,它将接受两个必需参数(模式周围的字符数和模式),以及可选文件列表(默认为stdin)。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接