PowerShell正则表达式选择行并解析字段
问题描述:
我有一个包含有关程序信息的文件。 我想要的是获取有关特定项目的一些信息。PowerShell正则表达式选择行并解析字段
这是文件的结构。
sometext...program.EXE;Thu, 04 May 2017 08:58:48 -0700;Wed, 27 Sep 2017 10:50:00 -0700;Wed, 04 Oct 2017 00:00:31 -0700;True;False, 17:38:05.810;30...somtext
我是从上面的文件中得到以下细节。每个字段与;
p = program.exe
dt1 = Thu, 04 May 2017 08:58:48 -0700
dt2 = Wed, 27 Sep 2017 10:50:00 -0700
dt3 = Wed, 04 Oct 2017 00:00:31 -0700
d1 = True
d2 = False
Get-Content .\file.txt
分离到目前为止,我有\W*((?i)program.exe(?-i))\W*
与之相匹配的。 但我不知道如何前进,阅读所有的字段并解析它。
答
下一页尝试
$p,$dt1,$dt2,$dt3,$d1,[email protected]'
sometext...program.EXE;Thu, 04 May 2017 08:58:48 -0700;Wed, 27 Sep 2017 10:50:00 -0700;Wed, 04 Oct 2017 00:00:31 -0700;True;False, 17:38:05.810;30...somtext
'@|
Select-String '(program.exe)[^;]*(?:;([^;]+)){3}(?:;(true|false)){2},' -AllMatches|
ForEach-Object {$_.Matches}|
ForEach-Object {$_.Groups[1..3]}|
ForEach-Object {$_.Captures}|
Select-Object -ExpandProperty Value
$p,$dt1,$dt2,$dt3,$d1,$d2
这能帮助你吗?
@'
sometext...program.EXE;Thu, 04 May 2017 08:58:48 -0700;Wed, 27 Sep 2017 10:50:00 -0700;Wed, 04 Oct 2017 00:00:31 -0700;True;False, 17:38:05.810;30...somtext
'@|
Select-String '([^;]+)' -AllMatches|
ForEach-Object {$_.Matches}|
ForEach-Object {$_.Groups[1].Value}
+0
这给了我'sometext ... program.EXE'作为第一个对象。我如何从'program.exe only'开始。此外,我需要将值存储到像我在问题中的变量。谢谢 – Omar
答
>> sometext...program.EXE;Thu, 04 May 2017 08:58:48 -0700;Wed, 27 Sep 2017 10:50:00 -0700;Wed, 04 Oct 2017 00:00:31 -0700;True;False, 17:38:05.810;30...somtext
>> @'|
>> Select-String '(?i)\W*(program\.exe)\W*(.*?;)(.*?;)(.*?;)(.*?;)(.*?;)'|
>> % {$_.Matches}|
>> % {$p=$_.Groups[1].Value;$dt1=$_.Groups[2].Value;$dt2=$_.Groups[3].Value;$dt3=$_.Groups[4].Value;$d1=$_.Groups[5].Value;$d2=$_.Groups[6].Value}
:\> $p
program.EXE
:\> $dt1
Thu, 04 May 2017 08:58:48 -0700;
:\> $dt2
Wed, 27 Sep 2017 10:50:00 -0700;
:\> $dt3
Wed, 04 Oct 2017 00:00:31 -0700;
:\> $d1
True;
:\> $d2
False, 17:38:05.810;
:\>
OR
IN: \> "sometext...program.EXE;Thu, 04 May 2017 08:58:48 -0700;Wed, 27 Sep 2017 10:50:00 -0700;Wed, 04 Oct 2017 00:00:31 -0700;True;False, 17:38:05.810;30..
.somtext"|
IN: >> Select-String '(?i)\W*(program\.exe)\W*(.*?;)(.*?;)(.*?;)(.*?;)(.*?;)' -OutVariable o
OUT:
sometext...program.EXE;Thu, 04 May 2017 08:58:48 -0700;Wed, 27 Sep 2017 10:50:00 -0700;Wed, 04 Oct 2017 00:00:31 -0700;True;False, 17:38:05.810;30...somtext
IN: \> $f,$p,$dt1,$dt2,$dt3,$d1,$d2=% -inputObject $o.Matches.Groups {$_.Value}
IN: \> $d2
OUT: False, 17:38:05.810;
我分配每个组所需的变量。看看这是否有效。对任何天真的道歉,我不熟悉PowerShell。
答
这里是不是一个内胆,无正则表达式:
$array = (Get-Content .\file.txt -Raw) -split ';'
$exe = 'program.EXE'
for ($i = 0; $i -lt $array.Count; $i++) {
if ($array[$i].EndsWith($exe)) {
$p = $exe.ToLower()
$dt1 = $array[++$i]
$dt2 = $array[++$i]
$dt3 = $array[++$i]
$d1 = $array[++$i]
$d2 = $array[++$i]
Write-Host "p = $p"
Write-Host "dt1 = $dt1"
Write-Host "dt2 = $dt2"
Write-Host "dt3 = $dt3"
Write-Host "d1 = $d1"
Write-Host "d2 = $d2"
}
}
试试这个...'\ W *程序\ .exe文件\ W *(*(我?)(* ?;)。? ;)(。* ?;)(。*?;)(。* ?;)' – kaza
@bulbus这是好的...我如何获取值并将它们分配给变量?谢谢 – Omar