【问题标题】:Find files with multiline strings matched查找多行字符串匹配的文件
【发布时间】:2014-05-08 05:53:36
【问题描述】:

我有一个文件夹,里面有很多这样的模式块文件:

115,55
,175:500
,123:400
,[blahblah]
,[blahblah]
...
,[blahblah]
200,*
,[blahblah]
,[blahblah]
,[blahblah]
...

每个块都从以数字开头的行开始,并在以数字开头的下一行之前结束。

我需要在同一块中查找包含“115,55”和“,123:400”的文件。两者之间可以有任意数量的行,例如:

115,55
,[blahblah]
...
,[blahblah]
,123:400

总结:在找到以数字开头的行之前,找到带有“115,55”和下一个带有“,123:400”的文件的名称。

注意:如果有帮助,这是一个 UDR(使用数据记录)文件。

Python、Perl、sed 或 awk 会有所帮助。

提前致谢!

【问题讨论】:

  • 您只想打印文件名还是整个块或两者都打印?你能提供你的预期输出吗?
  • 我只需要打印包含块的文件名。

标签: python perl sed awk


【解决方案1】:
perl -lne '/^115,55/ ... /^\d/ and /^,123:400/ or next;print $ARGV;close ARGV' *udr

【讨论】:

  • (/^115,55/ .. /^,123:400/) =~ /E/ or next 不起作用,因为它将跨块匹配。我相信我已经为此创建了一个修复程序。但是,perl 可以在像*udr 这样的全局对象上工作吗?我不知道如何正确地做到这一点,所以可以参考你的建议。
  • @Miller shell 执行 globing,而 perl 仅适用于 @ARGV。顺便说一句,您的范围匹配在同一行开始和停止。
  • 这就是我使用... 范围而不是.. 的原因。所以它不会在同一条线上停止和开始。
  • 刚刚意识到$1 实际上是不必要的。现在读起来更合乎逻辑。 if in block && inner test.
  • @Miller perl -lne 'print($ARGV),close ARGV if /^115,55/ ... /^\d/ and /^,123:400/'
【解决方案2】:

使用awk

awk '/115,55/{f=1;next}!/^,/{f=0;next}/,123:400/&&f{print FILENAME;nextfile}' /path/to/files/*

【讨论】:

  • 哦,我刚刚发现它会为文件上的每一次点击打印文件名。找到一个匹配项时,有什么方法可以中断并继续下一个文件?这将提高性能并缩小输出。
  • @Yiğit perl 解决方案只打印文件名一次。
  • @Yiğit 是的,检查更新的解决方案。 nextfile 跳出当前文件并移动到下一个文件。
猜你喜欢
  • 1970-01-01
  • 2018-04-09
  • 2011-03-16
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
相关资源
最近更新 更多