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

时间:2015-04-07 13:51:37

标签: regex powershell match ghci cabal-install

在我的个人资料文件中,我有一个运行沙盒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}

1 个答案:

答案 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在功能上与您尝试使用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