我需要使用powershell代码来获取特定区域的字符串
请参见下图,需要保留绿色矩形的内容,并删除所有其他字符串。
我在第二个区域添加了一些子字符串。它们看起来更复杂。我想知道是否可以一次提取所需的数据。
需要获取数据:
-------- [abc不好]
[c快速缓存/ L1-Cache]
[内存空间/系统内存]
-------- [太好cde]
LoadWeight
答案 0 :(得分:3)
我们可能可以从收集新行的表达式开始:
.*(\[ ddf \]|\[ edf \])[\s\S]*?description4\s*
.*(\[ ddf \]|\[ edf \])[\s\S]*?\s*(?<=--------\[)
.*(\[ ddf \]|\[ edf \])[\s\S]*?\s*\n(?:-)
如果描述4中有固定的子字符串,我们可以简单地使用它,例如:
.*(\[ ddf \]|\[ edf \])[\s\S]*?---\[ \?\?\?\? \]----.+\s*
.*(\[ .*abc.* \]|\[ .*cde \])[\s\S]*?\]----.+\s*
由于我们具有动态模式,并且会根据输入的变化而变化,因此我们将仅对每个规则使用一条规则,即从左上角获取一个非重复的唯一子字符串,并从该字符串中获取一个非重复的唯一子字符串。右下角,我们将设计表达式,然后使用逻辑或将它们连接起来:
(.*(\[ .*系统概述.* \][\s\S]*?LapTop\s*)|(.*\[ AIDA64 Extreme \][\s\S]*?10:14\s*)|(.*\[ DMI \])[\s\S]*?HuronRiver CRB.+\s*)
(.*(\[ .*TOP LEFT.* \][\s\S]*?Bottom RIGHT.*\s*))|(.*(\[ .*TOP LEFT.* \][\s\S]*?Bottom RIGHT.*\s*))
答案 1 :(得分:1)
假设输入来自文件,
Get-Content file.txt -raw
和Where-Object
来按部分中的唯一单词进行过滤$Unique = [regex]::Escape("[ abc")
(Get-Content .\file.txt -raw) -split '(?M)(?=^--------\[)' -ne '' |
Where-Object { $PSItem -match $Unique}
示例输出:
--------[ abc不好 ]----------------------------------------------------------------------------------------------------
好string1 description1
string2 description2
好string3 description3
string4 ---[ 太好了 ]----description4好2
编辑:适应了更改的需求的脚本
$Unique = 'abc不好|太好cde|c高速缓存 \/ L1-Cache|内存阵列 \/ System Memory'
(Get-Content .\SU_56606905.txt -raw) -split '(?M)(?=(^--------\[|^ \[))'|
Where-Object { $PSItem -match $Unique}
示例输出:
--------[ abc不好 ]----------------------------------------------------------------------------------------------------
[ c高速缓存 / L1-Cache ]
高速缓存:
类型 数据
状态 已启用
[ 内存阵列 / System Memory ]
内存阵列:
位置 主板
内存阵列功能 系统内存
--------[ 太好cde ]----------------------------------------------------------------------------------------------------
了string1 description1
string3 description3
string4 ---[ 太好了 ]----description4好b