需要删除匹配字符串以外的整行

时间:2012-04-09 08:54:33

标签: perl file-processing

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

Unhandled 开头并以 :

结尾的匹配模式

我尝试了下面打印匹配模式的代码,但我需要删除文件中的额外行。

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

以下是示例输入:

  

2012-04-09 01:52:13,717 - uhrerror - ERROR - 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 =(不是%20set)| utmcmd =(不是%20set)| utmctr =不粘% 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 个答案:

答案 0 :(得分:1)

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

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

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

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

perl -nE'say $1 if /(Unhandled error at .*?):/g' filename

答案 1 :(得分:0)

如果您希望从整个字符串中保留一个匹配项,则可以使用匹配项替换字符串值。 (即简单地指定新值)

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

答案 2 :(得分:0)

我会使用-l选项来处理行结尾(更少依赖于版本,为每个匹配打印一个新行),以及for循环来打印所有匹配,而不仅仅是第一个匹配{ {1}}。无需使用$1粘贴文件。

-0777

请注意,使用perl -nwle 'print for /Unhandled error at .*?:/g' 修饰符时,不需要捕获括号。

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

$1

答案 3 :(得分:0)

perl -0777 -i -pe 's/.*?(Unhandled error .*?):.*/$1/g' filename

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

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