2012-04-09 72 views
3

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

匹配模式開始Unhandled,並用:

結束我嘗試下面的代碼打印出匹配模式,但我需要從文件中刪除多餘的線條。

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

下面是示例輸入:

2012-04-09 01:52:13717 - 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 =(not%20set )| utmcmd =(not%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; neve rmissadeal = TRUE;的sessionid = c1e850e2e7db09e98a02415fc1ef490; __utmc = 1; __utmb = 1.7.10.1333916263; 「wsgi.file_wrapper」:「HTTP_ACCEPT_ENCODING」:「gzip的,放氣」}

回答

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

這將在文件中匹配的字符串替換錯誤塊。

-0777:將強制Perl一次讀取整個文件。
-i:表示就地編輯文件。
-p:是指通過文件的內容的環行由行,在單引號即's/.*?(Unhandled error .*?):.*/$1/g'執行代碼,並打印出結果(匹配的字符串),其被寫回到使用-i選項到文件。
-e:對於命令行

+0

這並不「從文件中刪除額外的行」。它只是從匹配行中刪除。 – ikegami 2012-04-09 17:49:58

+0

@Devendra:這對我來說訣竅..非常感謝:) btw ..我也做了一個python代碼... – 2012-04-10 08:17:33

+0

@ ShabbirAhmed-歡迎:) – 2012-04-10 08:34:05

0

如果一場比賽是所有你想從整個字符串保存,你可以替換匹配後的字符串值。 (即,簡單地分配新值)

如果在字符串內有幾個匹配項,最簡單的方法可能是將匹配項臨時存儲在一個數組中。如果你不再需要,就丟棄原來的變量。

+0

我只有一個匹配,但如果模式被發現只應刪除該塊,並保持匹配模式。你能向我解釋命令嗎? – 2012-04-09 10:06:21

1

您給出的代碼已經提供了請求的行爲。

也就是說,程序中有一個巨大的冗餘字符串可以消除。

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

最後,sl the整個文件看起來完全是多餘的。

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

感謝您的回覆。 但它應該在塊中搜索上面的模式,如果查找刪除整個塊保留匹配的模式並移動到下一個塊。 P.S:我對perl不太好 – 2012-04-09 09:55:02

+0

@Shabbir Ahmed,你如何定義一個塊?早些時候,你說過你想刪除所有非機器文本,包括其他行的文本。現在你想談論一些塊? – ikegami 2012-04-09 17:51:19

0

我會用-l選項來處理行結束(少取決於版本,打印每場比賽一個新行),以及for循環打印所有的比賽,不只是第一個$1。無需使用-0777來啜泣文件。

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

請注意,使用/g修飾符時,不需要捕獲圓括號。

如果只有一個(第一)比賽將被打印,/g是多餘的,你可以用$1

perl -nlwe 'print $1 if /(Unhandled error at .*?):/' 
相關問題