Powershell Select-带循环的字符串并剪切为 .dat

Powershell Select-String with Loop and Cut to .dat

首先,我很抱歉我的英语不好

我是 Powershell 的新手,不太喜欢编程,但我愿意学习

所以我的问题是:

我得到了一个包含如下文本的 .conf 数据:

[XYZ1 - XYZXYZ, XYZXYZ]
room a201*,f110
XYZXYZXYZ
XYZXYZXYZ
XYZXYZXYZ
XYZXYZXYZ

[XYZ2 - XYZXYZ, XYZXYZ]
room a202*,f110
XYZXYZXYZ
XYZXYZXYZ
XYZXYZXYZ

我的目标是将文本导出为 csv 或其他数据,如下所示:

a201,[XYZ1 - XYZXYZ, XYZXYZ]
f110,[XYZ1 - XYZXYZ, XYZXYZ]
a202,[XYZ1 - XYZXYZ, XYZXYZ]
f110,[XYZ1 - XYZXYZ, XYZXYZ]

所以对于每个带有 [] 括号的文本,它应该取房间(下面的行)并检查,如果还有另一个房间(a201,f110),删除单词 "room" 和其他行在星号“*”下方并像上面一样导出它。

我的第一步是这样的:

Select String -input C:\xyz\text.conf -pattern "\[*\]","room  *" | select line

然后我尝试用 Substring 删除 "room" 这个词,但这没有用,我不知道如何为每个房间制作一个循环并将其导出到 2 列中。

希望大家帮帮我

问候马塞尔

以下可能是一种解决方案。这使用 Select-StringContext 属性 来保留上一行,然后您可以在其中拆分并替换搜索到的行以获得所需的输出。

Select-String -input C:\xyz\text.conf -pattern 'room' -Context 1,0 | % {
    $current = $_
    $current.Line -split ',' | % {
      "$($_ -replace 'room ' -replace '\*'),$($current.Context.PreContext)"
    }
}

测试脚本

("[XYZ1 - XYZXYZ, XYZXYZ]",
"room a201*,f110",
"XYZXYZXYZ",
"XYZXYZXYZ",
"XYZXYZXYZ",
"XYZXYZXYZ",
"",
"[XYZ2 - XYZXYZ, XYZXYZ]",
"room a202*,f110",
"XYZXYZXYZ",
"XYZXYZXYZ",
"XYZXYZXYZ") | 
    sls 'room' -Context 1,0 | % {
        $current = $_
        $current.Line -split ',' | % {"$($_ -replace 'room ' -replace '\*'),$($current.Context.PreContext)"}
    }

输出

a201,[XYZ1 - XYZXYZ, XYZXYZ]
f110,[XYZ1 - XYZXYZ, XYZXYZ]
a202,[XYZ2 - XYZXYZ, XYZXYZ]
f110,[XYZ2 - XYZXYZ, XYZXYZ]