複数行のデータを正規表現で1行に変換したいとします。正規表現でのみPerlでデータをピボットするには?
データは、HTTPエクスチェンジの開始および終了通知と、1つまたは複数の行に書き込まれた詳細で構成されます。ここで仕事をしているため正規表現は次のとおりです。
(\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
"正規表現のみで"行うのは悪い方法です(非効率的です)。行単位またはブロック単位のアプローチを検討する必要があります。 –