3

我需要的是:
我需要删除整行但需要保留匹配的字符串。

以 a开头Unhandled和结尾的匹配模式:

我尝试了以下打印匹配模式的代码,但我需要从文件中删除多余的行。

perl -0777 -ne 'print "Unhandled error at$1\n" while /Unhandled\ error\ at(.*?):/gs' filename

以下是示例输入:

2012-04-09 01:52:13,717 - uhrerror - 错误 - 22866 - /home/shabbir/web/middleware.py process_exception - 217 - /user/resetpassword/: : {'mod_wsgi.listener_port': '8080 ', 'HTTP_COOKIE': "__utma=1.627673239.1309689718.1333823126.1333916263.156; __utmz=1.1333636950.152.101.utmgclid=CMmkz934na8CFY4c6wod_R8JbA|utmccn=(not%20set)|utmcmd=(not%20set)|utmctr=non-stick%20kadai%20online ; subpopdd=yes; _msuuid_1690zlm11992=FCC09820-3004-413A-97A3-1088EE128CE9; _we_wk_ls_=%7Btime%3A'1322900804422'%7D; _msuuid_lf2uu38ua0=08D1CEFE-3C19-4B9E-8096-240B92BA0ADD; nevermissadeal=True; sessionid=c1e850e2e7db09e98a02415fc1ef490; __utmc =1; __utmb=1.7.10.1333916263; 'wsgi.file_wrapper': , 'HTTP_ACCEPT_ENCODING': 'gzip, deflate'}

4

4 回答 4

1

您提供的代码已经提供了请求的行为。

也就是说,您的程序中有一个巨大的冗余字符串可以消除。

perl -0777nE'say $1 while /(Unhandled error at .*?):/gs' filename

最后,啜饮整个文件似乎完全是多余的。

perl -nE'say $1 if /(Unhandled error at .*?):/g' filename
于 2012-04-09T09:41:58.850 回答
0

如果您只想从整个字符串中保留一个匹配项,则可以在之后将字符串值替换为匹配项。(即只需分配新值)

如果字符串中有多个匹配项,最简单的方法可能是将匹配项临时存储在数组中。然后,如果您不再需要它,只需丢弃原始变量。

于 2012-04-09T09:10:50.523 回答
0
perl -0777 -i -pe 's/.*?(Unhandled error .*?):.*/$1/g' filename

这将用文件中匹配的字符串替换错误块。

-0777: 将强制 Perl 一次性读取整个文件。
-i: 表示文件的就地编辑。
-p: 表示逐行循环文件内容,执行单引号中的代码,即打印结果(匹配的字符串),使用选项's/.*?(Unhandled error .*?):.*/$1/g'写回文件。: 用于命令行-i
-e

于 2012-04-09T12:39:40.577 回答
0

我会使用-l选项来处理行尾(较少依赖版本,为每个匹配打印一个新行),以及一个for循环来打印所有匹配,而不仅仅是第一个$1。无需使用-0777.

perl -nwle 'print for /Unhandled error at .*?:/g'

请注意,使用/g修饰符时,不需要捕获括号。

如果只打印一个(第一个)匹配项,/g则是多余的,您可以使用$1

perl -nlwe 'print $1 if /(Unhandled error at .*?):/'
于 2012-04-09T11:53:39.383 回答