Что Perl эквивалентен / тексту awk/,/КОНЕЦ/?

Я надеюсь заменять противный сценарий оболочки, который использует 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>
5
задан brian d foy 27 March 2010 в 02:12
поделиться

2 ответа

Думаю, это сработает:

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/'

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

6
ответ дан 14 December 2019 в 13:32
поделиться

В качестве однострочного (немного измененного с момента первого сообщения):

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 заставляет Perl принять следующий цикл вокруг вашей программы, 
 

, который заставляет его перебирать аргументы filename , вроде sed -n или awk:

  LINE: 
while (<>) { 
 ... # здесь идет ваша программа 
} 
 

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

0
ответ дан 14 December 2019 в 13:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: