gpt4 book ai didi

regex - 如何获取满足一定条件的$Matches索引的索引?

转载 作者:行者123 更新时间:2023-12-02 00:57:46 26 4
gpt4 key购买 nike

我将读取一个文本文件并将其过滤为我只需要的行,然后使用正则表达式提取内容。之后,我将找到小于特定值的值并获取其索引。使用该索引,我将重复上述步骤并提取另一个匹配项。得到比赛组后,我坚持了下来。我该如何进行?下面的示例只是文本文件的一行,以便于解释。

$content=Get-Content -Path "C:\log.txt"
$content | Select-String -Pattern 'encoded' | ForEach-Object {
if($_ -match "(.*) ([0-9]*) (.*),(.*)"){
$Matches[2]
}
}

$Matches[2] 类似于:

0667853434125024324055

I'm trying to get the index of the value that's smaller than 30, so that I could extract the next information I want from another regex matching of the same file.

$content=Get-Content -Path "C:\log.txt"
$content | Select-String -Pattern 'Input' | ForEach-Object {
if($_ -match "(.*) '(.*)':"){
$Matches[2]
# How do I extract the content of the $Matches[2] here from the previously obtained indexes?
}
}

提前致谢!感谢任何帮助!

一些 输入文件内容。真实文件会重复这样的 block :

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\myvideo.mp4':  Metadata:    major_brand     : isom    minor_version   : 512    compatible_brands: isomiso2avc1mp41    encoder         : Lavf54.63.104Output #0, mp4, to 'C:\output\myvideo.mp4':  Metadata:    encoder         : Lavf58.15.100    Stream #0:0(und): Video: hevc (Main 10) (hev1 / 0x31766568), yuv420p10le(progressive), 864x480, q=2-31, 12800 tbn (default)    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp (default)    Metadata:encoded 2058 frames, 1376.59 fps, 373.36 kbps, 3.66 MB

最佳答案

问题中有一个误解。 $matches[2] 不是您需要索引的值数组。它将表示 foreach-object block 的每次交互的标量值。这些结果都单独发送到管道。

尽管如此,我还是想回答这个问题。给定一个值数组,确定其中哪些值低于阈值并返回其在数组中的位置索引。

$results = $content | Select-String -Pattern 'encoded' | 
Where-object{$_ -match "(.*) ([0-9]*) (.*),(.*)"} |
ForEach-Object{$Matches[2]}

这类似于您在上面显示的代码。它将值保存到名为 $results 的数组中。

$threshold = 30
for($index=0; $index -lt $results.count; $index++){
if([int]$results[$index] -lt $threshold){
Write-Host "The value at index $index is $($results[$index]) which is below $threshold"
}
}

然后我们使用计数器一个一个地循环数组元素。检查每个值并报告我们当前所在的索引。

鉴于这种情况,我会完全走不同的路线


我想从一个稍微不同的方向来看待这个问题。了解每个文件都有多个 block ,就像您在问题中显示的那样,这些 block 将对应于您正在处理的多个文件,并且您只对少于 30 个编码帧的文件感兴趣。

注意:此解决方案在很大程度上取决于真实数据的外观。我只能根据问题的内容继续。如果实际数据与该解决方案的偏差太大,则无法保证该解决方案有效或提供预期结果。

使用 [regex] 可以将文件拆分成 block 。 Using names capture groups我们可以只从您想要的每个“ block ”中提取值。非贪婪捕获将确保我们不会在任何给定 block 之外进行匹配。然后我们制作自定义对象,我们可以像过滤普通 PowerShell 对象一样过滤这些对象。

如果名为 C:\log.txt 的文件如下所示:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\myvideo.mp4':  Metadata:    major_brand     : isom    minor_version   : 512    compatible_brands: isomiso2avc1mp41    encoder         : Lavf54.63.104Output #0, mp4, to 'C:\output\myvideo.mp4':  Metadata:    encoder         : Lavf58.15.100    Stream #0:0(und): Video: hevc (Main 10) (hev1 / 0x31766568), yuv420p10le(progressive), 864x480, q=2-31, 12800 tbn (default)    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp (default)    Metadata:encoded 2058 frames, 1376.59 fps, 373.36 kbps, 3.66 MBInput #1, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\myvideo2.mp4':  Metadata:    major_brand     : isom    minor_version   : 512    compatible_brands: isomiso2avc1mp41    encoder         : Lavf54.63.104Output #0, mp4, to 'C:\output\myvideo2.mp4':  Metadata:    encoder         : Lavf58.15.100    Stream #0:0(und): Video: hevc (Main 10) (hev1 / 0x31766568), yuv420p10le(progressive), 864x480, q=2-31, 12800 tbn (default)    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp (default)    Metadata:encoded 0 frames, 1376.59 fps, 373.36 kbps, 3.66 MB

We could run this:

$content = Get-Content -Path "C:\log.txt" -Raw

[regex]::Matches($content,"(?sm)Input #(?<number>\d+).*?from '(?<filename>.*?)'.*?encoded (?<frames>\d+)") | ForEach-Object{
[pscustomobject]@{
Index = $_.Groups["number"].Value
Filename = $_.Groups["filename"].Value
EncodedFrames = [int]$_.Groups["frames"].Value
}

}

它自己会返回

Index Filename        EncodedFrames
----- -------- -------------
0 C:\myvideo.mp4 2058
1 C:\myvideo2.mp4 0

所以让我们过滤那个输出。在最后一行添加以下内容,即在 Foreach block 结束括号之后:| Where-Object{$_.EncodedFrames -lt 30} 你会得到你想要的。然后你可以添加 | Select-Object -expand Filename 以获取这些文件名。

现在在一起

$content = Get-Content -Path "C:\log.txt" -Raw

[regex]::Matches($content,"(?sm)Input #(?<number>\d+).*?from '(?<filename>.*?)'.*?encoded (?<frames>\d+)") | ForEach-Object{
[pscustomobject]@{
Index = $_.Groups["number"].Value
Filename = $_.Groups["filename"].Value
EncodedFrames = [int]$_.Groups["frames"].Value
}

} | Where-Object{$_.EncodedFrames -lt 30} | Select-Object -expand Filename

关于regex - 如何获取满足一定条件的$Matches索引的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53101485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com