Я надеюсь заменять противный сценарий оболочки, который использует 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>
Думаю, это сработает:
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/'
, если ТЕКСТ - длинная строка, которую вы хотите ввести только один раз. . Изменение приведет к редактированию строки, пока она соответствует шаблону.
В качестве однострочного (немного измененного с момента первого сообщения):
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 (<>) { ... # здесь идет ваша программа }
Затем ядро тела должно ждать начала, а затем печатать каждую строку до конца.