grep / ack -o с символами контекста (не строками) - PullRequest
17 голосов
/ 12 ноября 2011

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

grep -o "somepattern"

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

html/file.js
2:somepattern
5:somepattern

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

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

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

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

1 Ответ

22 голосов
/ 12 ноября 2011

Использование 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 символов после 'строки' ... (при условии, что они есть).

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

...