【问题标题】:perl regex: how to make regex match all strings in the file (that has only one line)perl 正则表达式:如何使正则表达式匹配文件中的所有字符串(只有一行)
【发布时间】:2014-03-06 06:20:03
【问题描述】:

如何告诉 perl regexp 重复遍历整行?

我的文件(测试)内容是这样的,所有数据都在一行中。实际文件要大得多,但所有数据都在一行中。

{"abc":"283420","def":"283420"},{"abc":"483420","def":"253420"},{"abc":"283120","def":"284420"}

我想用 perl 打印这个:

283420,283420
483420,253420
283120,284420

我当前的代码:

perl -nle 'print "$1,$2"  while( /.*abc\":\"(\d*)\".*def\":\"(\d+)/g)' test

只打印最后一个匹配项

283120,284420

【问题讨论】:

  • REGEX 不是正确的工具,请改用 JSON 解析器
  • 尝试使用 test 的不同名称。 test 可能是系统内置的,它可能会产生不需要的行为(即使它当前不在您的场景中)。最好安全一点。
  • sputnick,我的文件大小高达 2 GB。你能推荐可以做到这一点的 JSON 解析器吗?我认为 perl 在这里非常有效

标签: regex perl


【解决方案1】:

Perl 正则表达式是“贪婪的”,这意味着它们会尝试匹配尽可能多的字符。因此,您的第一个 .* 匹配所有内容,但不包括最后一个 abc,因此您只能获得最后一个数字。要告诉量词匹配最少的字符数,您需要在其后面加上一个问号。

perl -nle 'print "$1,$2"  while( /.*?abc\":\"(\d*)\".*?def\":\"(\d+)/g)' test

【讨论】:

  • 速度很快,很棒。谢谢!
  • sputnik 的评论很好。这是 JSON,所以 JSON 解析器可能是最好的。
猜你喜欢
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
相关资源
最近更新 更多