如何执行一个进程并在其输出中找到包含特定搜索文本的行?我需要找到两个不同的模式,第一个模式,如果不存在则找到另一个模式,然后使用同一行中的值。
我尝试执行如下过程:
$lines = (youtube-dl --list-formats $url) |out-string
该命令打印如下内容:
[youtube] 5qap5aO4i9A: Downloading webpage
[youtube] 5qap5aO4i9A: Downloading m3u8 information
[youtube] 5qap5aO4i9A: Downloading MPD manifest
[info] Available formats for 5qap5aO4i9A:
format code extension resolution note
91 mp4 256x144 290k , avc1.42c00b, 15.0fps, mp4a.40.5
92 mp4 426x240 546k , avc1.4d4015, 30.0fps, mp4a.40.5
93 mp4 640x360 1209k , avc1.4d401e, 30.0fps, mp4a.40.2
94 mp4 854x480 1568k , avc1.4d401f, 30.0fps, mp4a.40.2
95 mp4 1280x720 2969k , avc1.4d401f, 30.0fps, mp4a.40.2
96 mp4 1920x1080 5420k , avc1.640028, 30.0fps, mp4a.40.2 (best)
我不知道那是什么,是单个多行字符串还是行数组,我找不到。但这些经常被引用的方法都不起作用:我要么什么也得不到,要么一次得到所有行。
$lines |where { $_ -like "*1280x720*" }
$lines |where { $_ -like "1280x720" }
@($lines) -match "1280x720"
我正在寻找“1280x720”以及作为后备的“(最佳)”。
在匹配的行中,如果存在,我只需要该行的第一个数字。在这种情况下,这将是“95”或“96”。这如何在 PowerShell 中工作?我可以在 Bash 中轻松完成,并且知道 CMD 无法帮助我。
(这里显示的所有代码都是从网上收集的。我永远不会理解 PowerShell 语法,我很乐意坚持使用 C# 和 Bash;PowerShell 在我看来是难以理解的。在 PS 中让某些东西工作起来比为其编写 C 程序花费的时间更长。)
答案1
请尝试以下操作:
youtube-dl --list-formats $url | Select-String "1280x720"
我正在使用选择字符串cmdlet 如下:
使用正则表达式匹配在输入字符串和文件中搜索文本模式。您可以使用类似于 UNIX 中的 grep 或 Windows 中的 findstr.exe 的 Select-String。
youtbut-dl 的输出将通过管道传输到 Select-String,后者将选择符合条件的行。
答案2
删除并循环遍历使用来匹配或 的| Out-String
行数组:switch
1280x720
best
$lines = (youtube-dl --list-formats $url)
switch -Regex ($lines) {
'1280x720|best' {
# return the number in the first column
($_ -split '\s+')[0]
}
}
使用您的示例行,这将返回
95
96