2017-02-20 19 views
0

grep будет возвращать строки в файле, которые соответствуют определенному шаблону:Как я могу изменить определение «строка» в grep?

grep pattern file

Поищет через файл и вернуть все строки, соответствующие шаблону .

Моего базовый код имеет много заявлений многоканальных, такие как:

int x = somefunc(a, 
       b, 
       10, 
       someclass(10), 
       foo, 
       bar); 

я хочу, чтобы иметь возможность grep мой файл и вернуть все заявления, а не только линию. Например, если я хочу, чтобы все вызовы somefunc, которые используют foo, я мог бы сделать:

grep -e 'somefunc.*foo' filename 

и получить весь вызов функции, которую я могу трубы в другую программу для дальнейшей обработки:

grep -e 'somefunc.*foo' filename | grep -v bar 

По существу, я хочу сообщить grep, что мои линии заканчиваются ;, а не с EOL.

Я не могу использовать переключатели -C, -A или -B, так как я не всегда знаю, сколько строк будет в инструкции. Например, приведенный выше пример можно записать в виде:

int x = somefunc(a, b, 
       10, someclass(10), 
       foo, bar); 

Есть ли способ сделать это с помощью grep или любого другого общего инструмента?

+0

Привет, Натан, не могли бы вы принять любой из следующих ответов, наиболее подходящих для вашего требования? –

+0

Я попробовал их, но ни один из них не был действительно удовлетворительным –

ответ

0

Хорошо, сделайте то, что вы сказали. Измените ; на \n и \n на ;, сделайте grep и измените их снова.

re=$1 
cat "[email protected]" | # tr only reads from stdin 
    tr '\n;' ';\n' | 
    grep -- "$re" | 
    tr '\n;' ';\n' 
0

Допустим, у нас есть файл test_grep с содержимым:

int x = somefunc(a, 
       b, 
       10, 
       someclass(10), 
       foo, 
       bar); 

float y = 2 

int z = somefunc(a, b, 
       10, someclass(10), 
       foo, bar); 

float w = 4 

grep -Pzo '(?s)somefunc\(.*?foo.*?\);' test_grep 

P - позволяет Perl регулярные expresssions

z - подавление новой строки в конце строки, субтитируя его для нулевого символа.

o - выводит только совпадающая части

(?s) - PCRE_DOTALL режим, лечит . как любой символ или символ новой строки


Выходной сигнал (для приведенного выше примера):

somefunc(a, 
       b, 
       10, 
       someclass(10), 
       foo, 
       bar); 
somefunc(a, b, 
       10, someclass(10), 
       foo, bar); 
0

Из курс a perl однострочный номер подходит для счета.

perl -00 -nE 'say $& while /somefunc.*?foo/sg' file 
  • -00 режим Pragraph. Perl читает файл в кусках, разделенных пустыми строками.
  • -n Петля над каждым читать пункт
  • -E Сценарий следует из командной строки
  • /s Этого модификатор регулярных выражений расширяет определение шаблона . включать * while /регулярного выражения/g Сочетания while и /g ищет другой матч в появляется параграф после первого. Вы можете предпочесть if, если вы хотите только первый матч новой строки
  • *? регулярное выражение квантор, что означает как можно. Оставьте ? и не утерянный * означает как можно больше. НЕТ, действительно, что вы хотите здесь.
  • $& расширяется независимо от последнего соответствия регулярного выражение соответствует
1

Вы можете использовать awk изменить определение RECORD/LINE. RS по умолчанию установлен в новую строку, вы можете изменить его согласно требованию. В следующем примере RS изменен на ;. После строки будет искать someclass2 строки в "кодовых записей, который заканчивается ;"

awk Команда:

awk -v RS=';' '/someclass2/' input 

Пример:

awk -v RS=';' '/someclass2/' input 
int x = somefunc(a, 
       b, 
       10, 
       someclass2(10), 
       foo, 
       bar) 

После был ввод текста используется:

cat input 
int x = somefunc(a, 
       b, 
       10, 
       someclass0(10), 
       foo, 
       bar); 

int x = somefunc(a, 
       b, 
       10, 
       someclass1(10), 
       foo, 
       bar); 

int x = somefunc(a, 
       b, 
       10, 
       someclass2(10), 
       foo, 
       bar); 

 Смежные вопросы

  • Нет связанных вопросов^_^