什么是Perl相当于awk的/ text /,/ END /?

时间:2010-03-26 19:31:19

标签: perl awk

我希望替换一个令人讨厌的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>

2 个答案:

答案 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
            }

然后身体的核心是等待开始,然后打印每一行直到结束。