- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将读取一个文本文件并将其过滤为我只需要的行,然后使用正则表达式提取内容。之后,我将找到小于特定值的值并获取其索引。使用该索引,我将重复上述步骤并提取另一个匹配项。得到比赛组后,我坚持了下来。我该如何进行?下面的示例只是文本文件的一行,以便于解释。
$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/
我正在尝试为匹配中的每个匹配呈现一些 HTML,但是,我不太确定 实际上是正确的。 更具体地说,我不确定我是否可以使用 v-bind:match='match'在与循环相同的元素上 v-for='ma
它具有看似简单的代码: method match(Any:U: |) { self.Str; nqp::getlexcaller('$/') = Nil } 但是,这是它的行为: (^3).matc
如果您想检查某项是否与正则表达式匹配,如果是,请打印第一组,您就可以了.. import re match = re.match("(\d+)g", "123g") if match is not N
以下两个查询的结果有差异吗? SELECT * FROM table1, table2 WHERE ( MATCH(table1.row1) AGAINST('searchstring' IN
我正在尝试为我的日志文件创建一个语法文件。它们采用以下格式: [time] LEVEL filepath:line - message 我的语法文件如下所示: :syn region logTime
String#match 和 Regexp#match 在匹配成功时返回一个 MatchData: "".match(//) # => # //.match("") # => # //.match(:
我的代码中有这个函数: func match(match: GKMatch, player playerID: String, didChangeState state: GKPlayerConnec
我对 match 和 case 之间的区别感到困惑。在 document ,其中提到match支持通用模式匹配。 > (define (m x) (match x [(list a
我在检查特定元素中的空 HTML 内容时遇到了问题。当我使用 someElement.trim().match("") 即使 HTML 内容为空,我有时也会得到 true。我改成了 someEleme
我正在尝试使用正则表达式查找包含特定词的两个词之间的所有内容,但是这些词是重复的,所以我没有得到我想要的匹配项。 例如,我想要“你好”和“再见”之间的所有内容,以便它们之间存在“苹果”一词: hell
我目前正在构建一个 PHP 脚本,它将在需要时响应 HTTP“304 Not Modified”。 (请参阅 question #2086712 了解我目前所做的事情)。 目前我回答以下问题: If-
给定以下 XML 10 我希望能够正确识别内部 的 s : result = subject.gsub(/]*>)/, '<') 解释: ]* # any number of charact
这个问题在这里已经有了答案: How to error handle 1004 Error with WorksheetFunction.VLookup? (3 个回答) 3年前关闭。 目标:查找输入
我已经尝试了好一阵子了,但是我似乎无法弄清楚这两者之间的区别。特别是,与数据数组有关的差异: PS C:>$myarray = "a", "ab", "abc" PS C:>$myarray -mat
我正在努力研究如何构建一个宏,让我可以将模式和结果以向量的形式传递给 core.match/match 。我希望能够做到这一点: (let [x {:a 1} patterns [[{:a
这个问题在这里已经有了答案: Reference - What does this regex mean? (1 个回答) 关闭 8 年前。 如果这看起来微不足道但只是为了理解正则表达式,请原谅我:
我的 MySQL 表中有大约 20 行,其 Title 列为 Elsewhere 并具有其他不同的列参数。 我目前正在使用这样的查询,因为我的大多数搜索(通过 PHP 文件)都需要我进行猜测。所以我使
当找到匹配时,我必须从字符串中删除单词 让我们看看 我的输入字符串是 “肯诺克斯路” 比赛表演中的单词表 街道 驾驶 道路 4. 车道 输出字符串应该是: KENOX 我正在使用 vb.net 作为此
我正在搜索以下形式的字符串模式: XXXAXXX # exactly 3 Xs, followed by a non-X, followed by 3Xs 所有的 X 必须是相同的字符,并且 A 不能
好吧,我是 gulp 和 sass 的新手,我正在努力让它发挥作用。我正确安装了所有东西,但我收到了这个愚蠢的错误。有解决办法吗? PS C:\Users\Bojan Kolano\Desktop\F
我是一名优秀的程序员,十分优秀!