Что такое Perl эквивалентно awk's / text /, / END /? - PullRequest
4 голосов
/ 26 марта 2010

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

awk '/<TABLE\ WIDTH\=\"100\%\" BORDER\=1\ CELLSPACING\=0><TR\ class\=\"tabhead\"><TH>State<\/TH>/,/END/'

Как я могу сделать это в Perl?

ожидаемый результат будет

<TABLE WIDTH="100%" BORDER=1 CELLSPACING=0><TR class="tabhead"><TH>State</TH>

Оператор триггера Perl дает мне больше. (Все между звездочками - мусор)

*<h2>Browse Monitors (1 out of 497)</h2><br><font size="-1" style="font-weight:normal"> Use the <A HREF=/SiteScope/cgi/go.exe/SiteScope?page=monitorSummary&account=login15 >Monitor Description Report</a> to view current monitor configuration settings.</font>*<TABLE WIDTH="100%" BORDER=1 CELLSPACING=0><TR class="tabhead"><TH>State</TH>

Ответы [ 2 ]

5 голосов
/ 26 марта 2010

Я думаю, что это будет работать:

perl -ne 'print if /text/ .. /END/'

expr1 .. expr2 будет ложным, пока не встретит строку, где expr1 - истина. Тогда оно будет истинным, пока не встретит строку, где expr2 является истинным.


Обновление: , если вам нужно обрезать несовпадающий текст с начала первой совпадающей строки, это будет работать

perl -ne 'print if s/.*TEXT/TEXT/ .. s/END.*/END/`

или

perl -ne 'print if s/.*(TEXT)/$1/ .. s/(END).*/$1/'

если TEXT - длинная строка, которую вы хотите набрать только один раз. Изменение отредактирует строку, пока оно соответствует шаблону.

0 голосов
/ 26 марта 2010

Как однострочник (немного изменен с момента первого поста):

perl -n -e '$started = 1 if /<TABLE\ WIDTH\=\"100\%\" BORDER\=1\ CELLSPACING\=0><TR\ class\=\"tabhead\"><TH>State<\/TH>/; next unless $started; print; last if /END/;'

со страницы руководства perlrun:

   -n   causes Perl to assume the following loop around your program,

, что делает его повторяющимся по имени файла аргументы вроде как sed -n или awk:

          LINE:
            while (<>) {
                ...             # your program goes here
            }

И тогда ядро ​​тела должно ждать начала, а затем печатать каждую строку до конца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...