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