提问人:Guilherme Kruger 提问时间:10/20/2023 最后编辑:mklement0Guilherme Kruger 更新时间:10/21/2023 访问量:52
在 powershell 中需要与“cat $CONFIG |sed -n '/start/,/^finish/p'”
Need a similar command in powershell to "cat $CONFIG | sed -n '/start/,/^finish/p'"
问:
我的第一篇文章,对不起基本的英语。(向巴德求助)
我想连续搜索了长达四个小时,以了解如何在 PowerShell 中为 Linux shell 命令执行类似的命令。
目标是捕获具有无限行数的 txt 文件中两个语句之间的任何行。
找到了一些函数来执行此操作,但仅适用于 CHARACTERS,并且我需要处理字符串。https://powershellone.wordpress.com/2021/02/24/using-powershell-and-regex-to-extract-text-between-delimiters/
请帮忙
答:
将 switch
语句与其 和 参数一起使用:-File
-Regex
& {
$startOfRangeFound = $false
switch -Regex -File $CONFIG {
'start' { $_; $startOfRangeFound = $true; continue }
'^finish' { $_; break }
default { if ($startOfRangeFound) { $_ } }
}
} # redirect to output file here or pipe to another command
与您的命令 () 一样,上面从输入文件中提取一系列行,其包含端点由正则表达式模式定义。sed
cat $CONFIG | sed -n '/start/,/^finish/p'
具体来说,一旦找到与正则表达式匹配的行,它就会开始从输入文件发出行,并在找到行匹配后停止发出。start
^finish
注意:
仅当以下情况时,才需要机箱(用于流式处理行为)或 (用于收集所有输出优先行为) 需要在管道中使用上述内容或将其输出重定向到文件
& { ... }
$(...)
为了简单地将结果捕获到一个变量(它将接收一个字符串数组)[1]中,不需要任何外壳:你可以将调用用作表达式:
switch
$linesInRange = switch -Regex -File $CONFIG { ... }
[1] 严格来说,只有当输出两行或更多行时,才会构造数组。如果要确保即使只有一个输出行也分配了数组,请使用 $linesInRange = @(switch -Regex -File $CONFIG { ... }) 或 [array] $linesInRange = switch -Regex -File $CONFIG { ... }
;有关解释,请参阅此答案。
评论
猫