假设我有一个文本文件(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
结构是不理想的,因为这将删除任何匹配项的高亮/着色。
grep -o '.\{0,3\}eiusmod.\{0,3\}' lorem.txt
,请参见此grep
演示。 - Wiktor Stribiżew-o
选项。很好。对我来说足够接近了。但是我认为它在git grep
上不起作用。 - UlfRgrep -o '.\{0,3\}eiusmod.\{0,3\}' | grep --color eiusmod
。 - joanisgit 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