在 powershell 中需要与“cat $CONFIG |sed -n '/start/,/^finish/p'”

Need a similar command in powershell to "cat $CONFIG | sed -n '/start/,/^finish/p'"

提问人:Guilherme Kruger 提问时间:10/20/2023 最后编辑:mklement0Guilherme Kruger 更新时间:10/21/2023 访问量:52

问:

我的第一篇文章,对不起基本的英语。(向巴德求助)

我想连续搜索了长达四个小时,以了解如何在 PowerShell 中为 Linux shell 命令执行类似的命令。

目标是捕获具有无限行数的 txt 文件中两个语句之间的任何行。

找到了一些函数来执行此操作,但仅适用于 CHARACTERS,并且我需要处理字符串。https://powershellone.wordpress.com/2021/02/24/using-powershell-and-regex-to-extract-text-between-delimiters/

请帮忙

PowerShell SED 文本提取

评论

1赞 jdweng 10/20/2023
字符和字符串之间没有区别。问题在于返回字符。正则表达式有两种模式:线型和多线型。请参见 : stackoverflow.com/questions/12572164/...
0赞 tripleee 10/21/2023
顺便说一句,那是一只没用的

答:

2赞 mklement0 10/21/2023 #1

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 

与您的命令 () 一样,上面从输入文件中提取一系列行,其包含端点由正则表达式模式定义。sedcat $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 { ... };有关解释,请参阅此答案