2012-02-22 6 views
1

Я пытаюсь соответствовать следующему: Узор начинается с /* и заканчивается */\n(override\s+)public, пытались сделать что-то вроде этого:Match и печать нескольких строк с SED

sed -n '/\/\*/,/\*\/\n(override\s+)public/p' file 

И вот я спрашиваю, как это сделать чтобы правильно это записать :)

Если это возможно сделать с grep или awk - это вариант, если это однострочный шрифт в perl, это тоже хорошо.

PS. Я не уверен в синтаксисе sed regex, но \s должен быть пробелом, в идеале [\ \t\r\n].

EDIT:

Предположим, у вас есть:

/** 
* Some comment goes here 
*/ 
override public function ... 

/** 
* A comment for another function 
*/ 
public function ... 

Выражение даст вам эти два результата:

/** 
* Some comment goes here 
*/ 
override public 

и

/** 
* A comment for another function 
*/ 
public 

EDIT: Ev лучше, если кто-то может перевести приведенное ниже регулярное выражение в sed, это выполнит эту работу.

/\/\*(!?\*\/)*\*\/\s*(overrides\s+)?public/gm 

Обратите внимание, что флаг m означает, что регулярное выражение является многострочным, то есть отрицательная группа просмотра также будет соответствовать контурам строк. Но если это не представляется возможным, но согласование заканчивается линия все еще возможно, то выражение будет выглядеть следующим образом:

/\/\*((!?\*\/)*$)*\*\/[\r\n\t\ ]*(overrides[\r\n\t\ ]+)?public/g 
+0

Итак ... если строки 100 и 500 начинаются с «/ *», а линии 200 и 600 начинаются с «переопределять общедоступные» (с любым количеством пробелов между этими двумя словами), то вы хотите печатать строки 100- 600, заканчивающийся на «публичный»? – Beta

+0

'sed' может обрабатывать только одну строку за раз. Если вам нужен шаблон для охвата нескольких строк, вам нужно создать скрипт, который отслеживает, совпадает ли предыдущий llnes с началом вашего шаблона, а если нет, начните сначала. – tripleee

ответ

2

Я думаю, что это будет делать то, что вы хотите:

perl -0777 -n -e ' 
    for (m/(\/\*.*?\*\/\s+(override\s+)?public)/s) { 
     print "$1\n"; 
    } 
' file 

-0777 является Perl соглашение для «читать все из file сразу», а не по умолчанию по умолчанию.

-n говорит Perl, чтобы не печати входного файла (в отличие от -p который не печатать его).

-e сообщает perl, чтобы прочитать программу из командной строки.

Регулярное выражение во многом, как вы его написали, хотя я удалил бит запятой, так как было непонятно, что вы пытались сделать. Я использовал неохотный *? квантификатор, чтобы соответствовать кратчайшему возможному совпадению, а также флаг s, который обрабатывает весь файл как «одну строку», а это означает, что .*? соответствует границам строк, если в противном случае это не так.

m в предложении if вызывает выражение для выражения true, если регулярное выражение совпадает. s в конце выражения рассматривает вход как одну строку. В статье if мы печатаем $1, которая является первой группой, соответствующей регулярному выражению. Если вы хотите напечатать вторую группу, вы должны использовать $2.

Обновлено: Изменены группы так распечатает override и public, сделал override дополнительно за правки, изменил if к for, чтобы она соответствовала несколько экземпляров шаблона.

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