我想用多個正則表達式將多行數據轉換成一行。如何僅用正則表達式在Perl中轉換數據?
數據包含HTTP交換的開始和結束通知,後面跟着一行或多行的詳細信息。這裏是做這項工作的正則表達式:
(\d+-\d+-\d+) (\d+:\d+:\d+,\d+) INFO (\[com\.LoggingFilter\]) \(([^)]+)\) (\d+) \* Server in-bound request
(?=\5 > (.+)
[\s\S]*
\5 > user-agent:\s*(.+)
[\s\S]*
(\d+-\d+-\d+) (\d+:\d+:\d+,\d+) INFO \3 \(\4\) \5 \* Server out-bound response
\5 < (\d+)
[\s\S]*)
它(幾乎)工作原理:VIEW regex in action。在正則表達式替換之後,一些細節(由積極的展望保存)仍然保留。如何得到以下結果的
"88598";"2016-07-29";"00:00:08,262";"2016-07-29";"00:00:08,262";"http-10.2.3.4-8080-14";"Java/1.7.0_79";"303";"GET http://1.2.3.4:8080/service/api/
"88599";"2016-07-29";"00:00:08,382";"2016-07-29";"00:00:08,382";"http-10.2.3.4-8080-8";"Java/1.7.0_79";"303";"GET http://1.2.3.4:8080/service/api/"
(...)
代替
"88598";"2016-07-29";"00:00:08,262";"2016-07-29";"00:00:08,262";"http-10.2.3.4-8080-14";"Java/1.7.0_79";"303";"GET http://1.2.3.4:8080/service/api/"88598 > GET http://1.2.3.4:8080/service/api/
<garbage data here>
"88599";"2016-07-29";"00:00:08,382";"2016-07-29";"00:00:08,382";"http-10.2.3.4-8080-8";"Java/1.7.0_79";"303";"GET http://1.2.3.4:8080/service/api/"88599 > GET http://1.2.3.4:8080/service/api/
(...)
你已經給我們你的正則表達式,你得到的輸出和你想得到的輸出。這很好。我們缺少的是輸入數據的一個例子。 –
@DaveCross這是在正則表達式演示。 – horcrux
這樣做「只用正則表達式」是一種不好的方法(效率低下),您應該考慮逐行或分塊方法。 –