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

问题描述 投票:0回答:3

我必须格式化 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

我试过这个: 沃尔特:. (.)

这会选择 Walter: 和第一行。有没有办法不选择沃尔特:?

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

regex grep preg-replace
3个回答
1
投票

实际上是2个问题

  1. How to do a match across newlines (asked in the question title)
  2. How to do a match that discarding the date/time/person (asked in 问题体)

我来回答问题1:

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

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

查看更长的讨论

如何使用 grep 跨多行查找模式?


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'

0
投票

在这里尝试:http://refiddle.co/1iws

Walter:  \n.*

我已经修改了正则表达式,因此可以处理您的数据,但是您的数据再次结构化,尽管不可能编写一个能够正确匹配它的正则表达式

© www.soinside.com 2019 - 2024. All rights reserved.