【发布时间】:2020-09-16 15:15:59
【问题描述】:
我正在尝试使用正则表达式读取文件并匹配多行,但遇到了一些问题。我正在尝试读取的文件如下所示:
I 09/07/20 05:55PM [Backup Set] Starting backup to CrashPlan Central: 122 files (93.30MB) to back up
I 09/07/20 06:00PM [Backup Set] Completed backup to CrashPlan Central in 0h:04m:39s: 147 files (197.90MB) backed up, 5.30MB encrypted and sent @ 323.5Kbps (Effective rate: 2.7Mbps)
I 09/07/20 06:00PM - Unable to backup 1 file (next attempt within 15 minutes)
I 09/07/20 06:15PM [Backup Set] Starting backup to CrashPlan Central: 27 files (250MB) to back up
I 09/07/20 06:19PM [Backup Set] Completed backup to CrashPlan Central in 0h:04m:03s: 28 files (250MB) backed up, 5MB encrypted and sent @ 302.5Kbps (Effective rate: 4.3Mbps)
I 09/07/20 06:34PM [Backup Set] Starting backup to CrashPlan Central: 18 files (169.30KB) to back up
行似乎以CR LF 结尾。最终,我想找到包含“已完成备份到”的每一行,而不是立即包含“无法备份”的行。但是,即使是最简单的查询,我也遇到了麻烦。
这是我在文本中提取的方式:
PS C:\temp> $rawtext = Get-Content '.\new 1.txt' -raw
PS C:\temp> $rawtext.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
PS C:\temp> $rawtext | Measure-Object -Line
Lines Words Characters Property
----- ----- ---------- --------
6
以及一些简单的正则表达式查询的结果:
PS C:\temp> Select-String -InputObject $rawtext -pattern '^.*Completed.*$' # returns nothing
PS C:\temp> Select-String -InputObject $rawtext -pattern '(?m)^.*Completed.*$' # returns the entire contents of $rawtext
PS C:\temp> Select-String -InputObject $rawtext -pattern '(?ms)^.*Completed.*$' # also returns the entire contents of $rawtext
PS C:\temp> Select-String -InputObject $rawtext -pattern '(?ms)^.*Completed.*\r\n$' # returns nothing
PS C:\temp> Select-String -InputObject $rawtext -pattern '(?ms)^.*Completed.*\r\n' # returns the entire contents of $rawtext
我希望这些查询中至少有一个会返回包含“已完成”的每一行。但显然 Powershell 并没有像我想象的那样处理多行。任何人都可以阐明如何在 Powershell 中处理多行正则表达式吗?
FWIW,以下命令在 OSX 终端中成功获取了我想要的内容,并且本质上是我想在 PoSH 中复制的内容:
completedBackups=$(sed '/Completed[[:space:]]backup[[:space:]]to/!d;$!N;/\n.*Unable[[:space:]]to[[:space:]]backup[[:space:]]/!P;D' $f)
【问题讨论】:
标签: powershell