Grep/ack -o с символами контекста (не строк)

Я пытаюсь найти способ

grep -o "somepattern"

который дает мне что-то вроде

html/file.js
2:somepattern
5:somepattern

но было бы очень приятно иметь несколько символов (может быть, 20) до и/или после этого матча.

Я знаю, что есть способ показать строки до и после (контекст), но есть ли способ показать контекст символами? например.

html/file.js
2:function helloWorld(somepattern) {
5:    var foo = somepattern;

Причина, по которой я спрашиваю, заключается в том, что если я grep рекурсивно и попал в миниатюрный файл с совпадением, он печатает весь файл, что очень раздражает.

Ответы

Ответ 1

Использование ack:

% ack -o '.{0,10}string.{0,10}' | head
cli/cmdlineparser.cpp:22:#include <string>
cli/cmdlineparser.cpp:23:include <cstring>
cli/cmdlineparser.cpp:37:onst std::string& FileList
ctor<std::string>& PathNam
cli/cmdlineparser.cpp:57:     std::string FileName;
cli/cmdlineparser.cpp:66:onst std::string& FileList
list<std::string>& PathNam
cli/cmdlineparser.cpp:72:     std::string PathName;
cli/cmdlineparser.cpp:92:onst std::string &message)
cli/cmdlineparser.cpp:133:onst std::string errmsg = 

Использование (Gnu) grep:

% grep -no '.\{0,10\}string.\{0,10\}' **/*.[ch]* | head
cli/cmdlineparser.cpp:22:#include <string>
cli/cmdlineparser.cpp:23:include <cstring>
cli/cmdlineparser.cpp:37:onst std::string& FileList
ctor<std::string>& PathNam
cli/cmdlineparser.cpp:57:     std::string FileName;
cli/cmdlineparser.cpp:66:onst std::string& FileList
list<std::string>& PathNam
cli/cmdlineparser.cpp:72:     std::string PathName;
cli/cmdlineparser.cpp:92:onst std::string &message)
cli/cmdlineparser.cpp:133:onst std::string errmsg = 

... показывает до 10 символов до и 10 символов после "string"... (если они есть).

Я использую | head здесь только для того, чтобы ограничить вывод на 10 строк для ясности.