Powershell:从字符串中拉出 URL
Powershell: Pull URL out of String
我正在从文本文件中提取字符串,如下所示:
C:\Users\users\Documents\Firefox\tools\Install.ps1:37: Url = "https://somewebsite.com"
我需要了解如何删除 URL 以外的所有内容,因此它应该如下所示:
https://www.somewebsite.com
这是我尝试过的:
$Urlselect = Select-String -Path "$zipPath\tools\chocolateyInstall.ps1" -Pattern "url","Url"-List # Selects URL download path
$Urlselect = $Urlselect -replace ".*" ","" -replace ""*.","" # remove everything but the download link
但这并没有起到任何作用。我认为它与正则表达式有关,但我不确定如何表达。任何帮助表示赞赏。谢谢
我建议将 switch
statement 与 -Regex
和 -File
选项一起使用:
$url = switch -regex -file "$zipPath\tools\chocolateyInstall.ps1" {
' Url = "(.*?)"' { $Matches[1]; break }
}
-file
使 switch
遍历指定文件的所有行。
-regex
将分支条件解释为 regular expressions,并且自动 $Matches
变量可用于关联的脚本块 ({ ... }
) 以访问结果匹配项,特别是正则表达式 ((...)
) 中第一个(也是唯一一个)捕获组捕获的内容 - 感兴趣的 URL。
一旦找到第一个匹配项,break
就会停止处理。 (要继续匹配,请使用 continue
)。
如果你想使用 Select-String
:
$url = Select-String -List ' Url = "(.*?)"' "$zipPath\tools\chocolateyInstall.ps1" |
ForEach-Object { $_.Matches.Groups[1].Value }
请注意,switch
解决方案的性能会好得多。
至于你试过的:
Select-String -Path "$zipPath\tools\chocolateyInstall.ps1" -Pattern "url","Url"
Select-String
默认情况下 不区分大小写 ,因此无需指定同一字符串的大小写变体。 (相反,您必须使用 -CaseSensitive
开关强制大小写-敏感 匹配)。
另请注意,Select-String
不会将匹配行 直接 输出为 字符串 ,而是作为 match-information objects;要获取匹配行,请访问 .Line
属性[1].
$Urlselect -replace ".*" ","" -replace ""*.",""
".*" "
和 ""*."
导致 语法错误 ,因为你忘记了 escape _embedded "
为 `"
。
或者,使用 '...'
(单引号 文字 字符串),它允许您按原样嵌入 "
,通常更适合正则表达式和替换操作数,因为没有混淆 PowerShell 可能预先解释的部分(字符串扩展)。
即使解决了转义问题,您的 -replace
操作也不会起作用,因为 .*"
匹配 greedily 因此直到最后 "
;这是一个更正的解决方案,具有 非贪婪 匹配,并省略了替换操作数(这使其默认为空字符串):
PS> 'C:\...ps1:37: Url = "https://somewebsite.com"' -replace '^.*?"' -replace '"$'
https://somewebsite.com
^.*?"
非贪婪地替换所有直到 first "
.
"$
替换字符串末尾的 "
。
但是,您可以使用 单个 -replace
操作来完成此操作,使用与顶部 switch
解决方案相同的正则表达式:
PS> 'C:\...ps1:37: Url = "https://somewebsite.com"' -replace '^.*?"(.*?)"', ''
https://somewebsite.com
替换操作数中的</code>指的是第一个捕获组(<code>(...)
)捕获的内容,即裸URL;有关详细信息,请参阅 。
[1] 请注意,有一个绿灯功能建议 - Windows PowerShell Core 6.2.0 尚未实施 - 允许 Select-String
直接发出字符串,使用建议的 -Raw
开关 - 请参阅 https://github.com/PowerShell/PowerShell/issues/7713
我正在从文本文件中提取字符串,如下所示:
C:\Users\users\Documents\Firefox\tools\Install.ps1:37: Url = "https://somewebsite.com"
我需要了解如何删除 URL 以外的所有内容,因此它应该如下所示:
https://www.somewebsite.com
这是我尝试过的:
$Urlselect = Select-String -Path "$zipPath\tools\chocolateyInstall.ps1" -Pattern "url","Url"-List # Selects URL download path
$Urlselect = $Urlselect -replace ".*" ","" -replace ""*.","" # remove everything but the download link
但这并没有起到任何作用。我认为它与正则表达式有关,但我不确定如何表达。任何帮助表示赞赏。谢谢
我建议将 switch
statement 与 -Regex
和 -File
选项一起使用:
$url = switch -regex -file "$zipPath\tools\chocolateyInstall.ps1" {
' Url = "(.*?)"' { $Matches[1]; break }
}
-file
使switch
遍历指定文件的所有行。-regex
将分支条件解释为 regular expressions,并且自动$Matches
变量可用于关联的脚本块 ({ ... }
) 以访问结果匹配项,特别是正则表达式 ((...)
) 中第一个(也是唯一一个)捕获组捕获的内容 - 感兴趣的 URL。
一旦找到第一个匹配项,break
就会停止处理。 (要继续匹配,请使用continue
)。
如果你想使用 Select-String
:
$url = Select-String -List ' Url = "(.*?)"' "$zipPath\tools\chocolateyInstall.ps1" |
ForEach-Object { $_.Matches.Groups[1].Value }
请注意,switch
解决方案的性能会好得多。
至于你试过的:
Select-String -Path "$zipPath\tools\chocolateyInstall.ps1" -Pattern "url","Url"
Select-String
默认情况下 不区分大小写 ,因此无需指定同一字符串的大小写变体。 (相反,您必须使用 -CaseSensitive
开关强制大小写-敏感 匹配)。
另请注意,Select-String
不会将匹配行 直接 输出为 字符串 ,而是作为 match-information objects;要获取匹配行,请访问 .Line
属性[1].
$Urlselect -replace ".*" ","" -replace ""*.",""
".*" "
和 ""*."
导致 语法错误 ,因为你忘记了 escape _embedded "
为 `"
。
或者,使用 '...'
(单引号 文字 字符串),它允许您按原样嵌入 "
,通常更适合正则表达式和替换操作数,因为没有混淆 PowerShell 可能预先解释的部分(字符串扩展)。
即使解决了转义问题,您的 -replace
操作也不会起作用,因为 .*"
匹配 greedily 因此直到最后 "
;这是一个更正的解决方案,具有 非贪婪 匹配,并省略了替换操作数(这使其默认为空字符串):
PS> 'C:\...ps1:37: Url = "https://somewebsite.com"' -replace '^.*?"' -replace '"$'
https://somewebsite.com
^.*?"
非贪婪地替换所有直到 first"
."$
替换字符串末尾的"
。
但是,您可以使用 单个 -replace
操作来完成此操作,使用与顶部 switch
解决方案相同的正则表达式:
PS> 'C:\...ps1:37: Url = "https://somewebsite.com"' -replace '^.*?"(.*?)"', ''
https://somewebsite.com
替换操作数中的</code>指的是第一个捕获组(<code>(...)
)捕获的内容,即裸URL;有关详细信息,请参阅
[1] 请注意,有一个绿灯功能建议 - Windows PowerShell Core 6.2.0 尚未实施 - 允许 Select-String
直接发出字符串,使用建议的 -Raw
开关 - 请参阅 https://github.com/PowerShell/PowerShell/issues/7713