Perl 的等价于 awk 的 /text/,/END/ 吗?

发布于 2024-08-26 22:13:30 字数 881 浏览 0 评论 0原文

我正在寻找替换一个令人讨厌的 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>

I am looking to replace a nasty shell script that uses awk to trim down some HTML. The problem is I cannot find anything in Perl that does the aforementioned function

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

How can I do this in Perl?

the expected output would be

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

The Perl flipflop operator gives me WAY more. (Everything between the asterisks is junk)

*<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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

独木成林 2024-09-02 22:13:30

我认为这会起作用:

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

expr1 .. expr2 将为 false,直到遇到 expr1 为 true 的行。
然后它将为 true,直到遇到 expr2 为 true 的行。


更新:如果您需要从第一个匹配行的前面修剪掉不匹配的文本,

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

或者

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

如果 TEXT 是您只想键入一次的长字符串,那么这将起作用。更改将在进行模式匹配时编辑该行。

I think this will work:

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

expr1 .. expr2 will be false until it encounters a line where expr1 is true.
Then it will be true until it encounters a line where expr2 is true.


Update: if you need to trim the non-matching text from the front of the first matching line, this will work

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

or

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

if TEXT is a long string that you only want to type once. The change will edit the line while it does the pattern match.

你怎么这么可爱啊 2024-09-02 22:13:30

作为一句话(自第一篇文章以来略有变化):

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 在程序中假设以下循环,

这使得它迭代文件名
参数有点像 sed -n 或 awk:

<前><代码>行:
而 (<>) {
... # 你的程序放在这里
}

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

As a one-liner (slightly changed since first post):

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

From the perlrun man page:

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

which makes it iterate over filename
arguments somewhat like sed -n or awk:

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

And then the core of the body is to wait for the start, then print every line until the end.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文