我正在从一个类似于以下内容的文本文件中提取字符串:
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
但这并没有做任何事情。我认为它与正则表达式有关,但我不确定如何放置它。任何帮助表示赞赏。谢谢
答案 0 :(得分:1)
我建议将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
不会以 string 的形式直接输出匹配行 ,而是以match-information objects的形式输出;要获取匹配的行,请访问.Line
属性 [1] 。
$Urlselect -replace ".*" ","" -replace ""*.",""
".*" "
和""*."
导致语法错误,因为您忘记了将嵌入"
的 转义为{{1} }。
或者,使用`"
(单引号 literal 字符串),它允许您按原样嵌入'...'
,通常更适合于正则表达式和替换操作数,因为对于PowerShell可以解释哪些部分(字符串扩展)没有任何困惑。
即使解决了转义问题,您的"
操作也不起作用,因为-replace
匹配贪婪地,因此匹配的是 last < / em> .*"
;这是具有 non-greedy 匹配的更正解决方案,并且省略了替换操作数(这使其默认为空字符串):
"
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 '^.*?"(.*?)"', '$1'
https://somewebsite.com
指的是第一个捕获组($1
)捕获的内容,即裸URL。有关更多信息,请参见this answer。
[1]请注意,有一个呈绿色亮起的功能建议-从Windows PowerShell Core 6.2.0开始尚未实现-允许(...)
使用建议的{{1}直接发出字符串}开关-参见https://github.com/PowerShell/PowerShell/issues/7713