如何缩短函数调用以仅检索与某些正则表达式字符串匹配的特定行

How can I shorten the function call to retrieve a certain line matching some regexp string only

在我的配置文件中,我定义了 运行 沙盒 ghci 实例,例如:

function sandbox-ghci {
  $regex = '^package-db: (.*)$'
  $db = Get-Content .\cabal.sandbox.config | foreach { if($_ -match $regex) { %{$_ -replace $regex, ''} } }
  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, ''} } }

编辑:

一次尝试提出(可以删除现在多余的 $regex 声明):

$db = Select-String -Path .\cabal.sandbox.config '^package-db: (.*)$' | % {$_.Matches} | % {$_.Groups[1].Value}

一个简单的解决方案是使用 -match 作为数组运算符,然后 trim "package".

$db = (Get-Content .\cabal.sandbox.config) -match $regex -replace "package-db: "

用额外的 -replace 感觉就像作弊,但我认为这会得到您想要的结果。继续阅读,我更喜欢这个地方。

使用回顾

更接近我所希望的。但是,如果有多于一行与 $regex 相匹配,则可以 return 一个数组。如果这是一个问题,您可以添加 Select-Object -First 1 以防万一。

$regex = '(?<=package-db: ).*'
$db = Get-Content .\cabal.sandbox.config | Where-Object{$_ -match $regex} | ForEach-Object{$Matches[0]}

使用 Where-Object 在功能上与您尝试对 foreachif 执行的操作相同。我们只是使用 $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