【问题标题】:PowerShell: Need to get values between two lines/rowsPowerShell:需要在两行/行之间获取值
【发布时间】:2023-03-29 10:41:01
【问题描述】:

我有一个具有类似结构的.txt 文件。

Configure text Example
Configure text Example
Configure text Example
---Start of Data---
Data I want to grab
Data I want to grab
Data I want to grab
Data I want to grab
---End of Data---

对我来说,在两行(数据开始和数据结束)之间获取数据的最佳方式是什么?

【问题讨论】:

标签: powershell scripting


【解决方案1】:

Regex 似乎是你最好的选择。

$file = "data.txt"
$pattern = "---Start of Data---([\s\S]*?)---End of Data---"

$string = Get-Content $file -Raw
$result = [regex]::match($string, $pattern).Groups[1].Value

$result 将包含您想要的输出。

【讨论】:

  • 那不行,您需要将-Raw 参数作为单个字符串使用到Get-Content
  • 同意。如果需要,OP 可以使用-Raw。但是上面的答案将解决他在问题中提出的问题。
  • Regex.Match Method 没有字符串 array (String[]) 的重载,因此 PowerShell “方便地”将其转换为单个字符串 ("$String")其中所有换行符都更改为空格(包括$result)。
  • 感谢您的意见@iRon - 我已经相应地编辑了我的答案。
  • 您还需要将您的 $pattern 更改为 "---Start of Data---([\s\S]*?)---End of Data---" 之类的东西,因为点 (.) 与换行符不匹配。
【解决方案2】:

除了Yash's great answer,如果您想捕捉可以通过某些开始和结束行识别的不同部分或部分,您可以使用switch 做一些有趣的事情

$text = @'
Configure text Example
Configure text Example
Configure text Example
---Start Part A---
Data I want to grab
Data I want to grab
Data I want to grab
Data I want to grab
---End A---
Some other text that isn't needed
Some other text that isn't needed
---Start Section B---
Data I want to grab in B
Data I want to grab in B
Data I want to grab in B
Data I want to grab in B
Data I want to grab in B
---End B---
'@ -split '\r?\n'

$inside = $false
$pattern = '---(?:Start|End) ?(\D+?)---'

switch -Regex ($text) {
    $pattern {
        $inside = !$inside
        $section = $Matches[1]
    }
    default {
        if ($inside) {
            [PSCustomObject]@{
                Section = $section
                Line = $_
            }
         }
    }
}

输出

Section   Line
-------   ----
Part A    Data I want to grab
Part A    Data I want to grab
Part A    Data I want to grab
Part A    Data I want to grab
Section B Data I want to grab in B
Section B Data I want to grab in B
Section B Data I want to grab in B
Section B Data I want to grab in B
Section B Data I want to grab in B

【讨论】: