如何使用正则表达式选择多行?

时间:2014-10-09 13:57:44

标签: regex grep preg-replace

我必须格式化50k行聊天记录。

源文件是纯文本,看起来像这样:

13. Mär. 01:32 - Walter:  
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

 13. Mär. 06:15 - Horst:  
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, 
sed diam nonumy eirmod tempor invidunt ut labore et 
dolore magna aliquyam erat, sed diam voluptua.
magna aliquyam erat, sed diam voluptua.

整个聊天中只有两个人 - 沃尔特和霍斯特。 我需要两个正则表达式,一个用于选择Walter的所有聊天文本,另一个用于选择Horst的所有聊天文本。

Walter的正则表达式应该从示例中选择此文本:

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

Horst的正则表达式应该从示例中选择此文本:

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, 
sed diam nonumy eirmod tempor invidunt ut labore et 
dolore magna aliquyam erat, sed diam voluptua.
magna aliquyam erat, sed diam voluptua.

仅选择文本行而不是日期/时间/人物行对我来说很重要。

更新 首先,谢谢快速回复。不幸的是,这并没有解决我的问题。 聊天文本的数字不尽相同。

不知怎的,我无法通过你的例子得到一个选择。

我在这里尝试过: http://regexr.com/39m2a

我尝试了这个: 沃尔特:(的)的 \ n

这选择了Walter:和第一行。有没有选择沃尔特:?

(我需要使用文本格式来格式化Indesign文档)

3 个答案:

答案 0 :(得分:1)

这些是实际的2个问题

  1. 如何跨换行符进行匹配(在问题标题中提问)
  2. 如何进行丢弃日期/时间/人的比赛(询问 问题机构)
  3. 我会回答问题1:

    在进行匹配之前,您需要更改行分隔符/记录分隔符。

    此分隔符取决于工具(它不是正则表达式语言本身的一部分)。例如。对于awk,您可以更改RS变量(您可以将其设置为多个字符,例如冒号+换行符)。对于GNU grep,您可以使用-z。

    请参阅更长时间的讨论

    How to find patterns across multiple lines using grep?

答案 1 :(得分:1)

这是我的解决方案:

awk '$5~/Walter:$/{p=1} $5!~/Walter:$/&&$5~/:$/{p=0} p'

awk -vname=Walter 'match($5,name":$"){p=1} !match($5,name":$")&&$5~/:$/{p=0} p'

要过滤掉空行和日期行,请通过

awk '$5!~":$"&&NF>0'

答案 2 :(得分:0)

在此尝试:http://refiddle.com/1iws
我已经修改了正则表达式,所以可以处理你的数据,但你的数据再次没有很好的结构,虽然不可能编写一个正确匹配它的正则表达式