【发布时间】: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 时开始考虑这个问题的,因此首选可用于普通grep 和git grep 的解决方案。
请注意另外,grep-pipe-sed 构造是不可取的,因为它会删除匹配的任何突出显示/着色。
【问题讨论】:
-
我怀疑您询问范围量词,例如
grep -o '.\{0,3\}eiusmod.\{0,3\}' lorem.txt,见thisgrepdemo -
我之前没有找到
-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.txt或git grep -E --all-match '.{0,3}eiusmod.{0,3}' lorem.txt | grep --color eiusmod吗?