在我的个人资料文件中,我有一个运行沙盒ghci
个实例的定义,如:
function sandbox-ghci {
$regex = '^package-db: (.*)$'
$db = Get-Content .\cabal.sandbox.config | foreach { if($_ -match $regex) { %{$_ -replace $regex, '${1}'} } }
Start-Process -FilePath ghci.exe -ArgumentList "-no-user-package-db -package-db $db $args"
}
Set-Alias -Name ghci -Value sandbox-ghci
我怎样才能缩短从.\cabal.sandbox.config
文件中检索某个正则表达式匹配行的行:
$db = Get-Content .\cabal.sandbox.config | foreach { if($_ -match $regex) { %{$_ -replace $regex, '${1}'} } }
编辑:
作为一次尝试提出(可以删除现在多余的$regex
声明):
$db = Select-String -Path .\cabal.sandbox.config '^package-db: (.*)$' | % {$_.Matches} | % {$_.Groups[1].Value}
答案 0 :(得分:1)
一个简单的解决方案是使用-match
作为数组运算符,然后修剪"包"。
$db = (Get-Content .\cabal.sandbox.config) -match $regex -replace "package-db: "
感觉就像额外的-replace
作弊,但我认为这会得到您正在寻找的结果。继续阅读,我更喜欢这里。
使用lookbehind
这比我希望的更接近。但是,如果有多个行匹配$regex
,则可以返回数组。如果这是一个问题,您可以添加Select-Object -First 1
以防万一。
$regex = '(?<=package-db: ).*'
$db = Get-Content .\cabal.sandbox.config | Where-Object{$_ -match $regex} | ForEach-Object{$Matches[0]}
使用Where-Object
在功能上与您尝试使用foreach
和if
的功能相同。我们只需使用$Matches[0]
来获取结果。
使用与上述相同的正则表达式,Select-String
解决方案也可以正常工作
$db = (Get-Content .\cabal.sandbox.config | Select-String -Pattern $regex).Matches.Value
和Arco一样引导我,你真的不需要浪费时间Get-Content
$db = (Select-String .\cabal.sandbox.config -Pattern $regex).Matches.Value
PowerShell 2.0或更低版本
怀疑你的版本是2.0或者什么的。我认为点符号在2.0中不起作用。我提出这个作为妥协
$db = Select-String .\cabal.sandbox.config -Pattern $regex | Select-Object -ExpandProperty Matches | Select-Object -ExpandProperty Value