Подходим и печатаем несколько строк с помощью sed - PullRequest
1 голос
/ 23 февраля 2012

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

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

РЕДАКТИРОВАТЬ: еще лучше, если кто-то сможет перевести приведенное ниже регулярное выражение в sed, это будет делатьjob.

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

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

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

1 Ответ

2 голосов
/ 23 февраля 2012

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

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

-0777 - это соглашение perl для "читать все file за раз", а не по умолчанию для line-by-line.

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

-eговорит Perl читать программу из командной строки.

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

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

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

...