我希望替换一个令人讨厌的shell脚本,它使用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>
答案 0 :(得分:5)
我认为这会奏效:
perl -ne 'print if /text/ .. /END/'
在遇到expr1 .. expr2
为真的行之前, expr1
将为false。
然后在遇到expr2
为真的行时才会成立。
<小时/>
更新:如果您需要修剪第一个匹配行前面的不匹配文字,这将有效
perl -ne 'print if s/.*TEXT/TEXT/ .. s/END.*/END/`
或
perl -ne 'print if s/.*(TEXT)/$1/ .. s/(END).*/$1/'
如果TEXT是一个你只想输入一次的长字符串。更改将在模式匹配时编辑该行。
答案 1 :(得分:0)
作为一个单行(自第一篇文章后略有变化):
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 }
然后身体的核心是等待开始,然后打印每一行直到结束。