3

我在 XML 中有一个大的日志文件(+100 000 行),如下所示:

<container>
   <request:getApples xml="...">
     ...
   </request:getApples>
   <request:getOranges xml="...">
     ...
   </request:getOranges>
</container>
...

我想将:getXXXX部分提取到

getApples
getOranges

通过在 Sublime Text 2 中进行正则表达式查找和替换。

就像是

Find:      [^(request:)]*(.*) xml
Replace:   $1\n

任何可以提供帮助的正则表达式大师?

4

4 回答 4

1

更正mart1n的答案并实际使用ST2和您的示例输入,我想出了以下内容:

首先,CtrlA全选。那么, CtrlH,

Search: .*?(get\w+) .*
Replace: $1

Replace All

然后,

Search: ^[^get].*$
Replace: nothing

Replace All

最后,

Search: ^\n
Replace: nothing

Replace All

剩下的就是:

getApples
getOranges
于 2013-08-01T16:05:50.963 回答
0

不熟悉 Sublime Text,但您可以分两部分进行:

  • 查找.*?\(get\w+\) .*并替换为\1。现在那些 get* 字符串在单独的行上,没有别的了。剩下的就是去除杂物。

  • 所以,有很多方法可以做到这一点。简单的一个:查找^[^g][^e][^t].*$并替换为空(空字符串)。

现在你的文件只包含你想要的字符串和一些空行,(我希望)Sublime 可以通过一些 delete-empty-lines 函数摆脱它们。

您可以快速将上述所有内容放入宏中,并随意执行任何遵循相同格式的输入;-)

于 2013-08-01T14:59:34.900 回答
0

如果您愿意从 sublime 文本中解决问题,您可以使用 dotall 标志和惰性匹配来仅提取 getXXX 部分。

更换

.*?(get\w*) .*?

$1\n

应该让你大部分时间,只在文件末尾留下一些我目前无法弄清楚的容易移除的结束标签。

您可以在此处查看此解决方案。

也许有人可以接受这个并想出一种方法来删除额外的结束标签。

于 2013-08-01T16:01:56.420 回答
0

尝试这个

找什么: :(\w+)>|.\s?

用。。。来代替: $1

如果没有按预期工作,请告诉我?

于 2021-02-21T11:25:23.543 回答