如何缩短函数调用以仅检索与某些正则表达式字符串匹配的特定行
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
在功能上与您尝试对 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
在我的配置文件中,我定义了 运行 沙盒 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
在功能上与您尝试对 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