【问题标题】:PowerShell, parsing, problem using a specific string with -match/-like and -splitPowerShell,解析,使用带有 -match/-like 和 -split 的特定字符串的问题
【发布时间】:2020-11-20 11:38:45
【问题描述】:

我有一个包含多行文本的变量,我正在尝试从中解析数据。现在在文本的中间是一个特定的字符串“Reference(s):”,我需要从这个特定的字符串上方获取所有内容。但是,我尝试过的所有方法都失败了。

我尝试将其设为分隔符

$Var.split("Reference(s) :")

我尝试了以下 2 个选项只是为了尝试捕获那一行(因为如果我能做到这一点,那么我知道我可以拉动它之前的所有东西。

$Var.split("`n") | Where-Object {$_ -match "Reference(s) :"}

$Var.split("`n") | Where-Object {$_ -like "*Reference(s) :*"}

我已经尝试了一些 if 语句(其中 $_ 是单行文本)

If ($_ -like "*Reference(s) :*") {some logic}

我不能只匹配“参考”,因为该词出现在文本中的其他地方......我需要它来处理该文本的多个实例。

我认为问题与括号、空格和冒号(特殊字符)有关。我确实尝试在每个特殊字符前加上一个 `,但这似乎不起作用。

有人有什么想法吗?一定有办法匹配特殊字符,我只是还没找到。

【问题讨论】:

    标签: string powershell comparison-operators


    【解决方案1】:

    如果$var 确实是单个字符串,您可以在参考点使用-split,然后检索第一个拆分字符串([0])。这将检索从字符串开头到分割点的所有内容。

    ($Var -split 'Reference\(s\) :')[0]
    

    由于-split 使用正则表达式匹配,您必须使用反斜杠转义正则表达式特殊字符才能按字面意思匹配它们。这里() 很特别。

    以后,您可以使用[regex]::Escape('String') 处理您的匹配字符串,它会为您完成所有转义。


    如果你想要参考点之前的线,你可以将你的字符串转换成一个数组。然后返回匹配行上方的行。

    foreach ($line in ($Var -split '\r?\n')) {
        if ($line -match 'Reference\(s\) :') { 
            $lastLine
        } else { 
            $lastLine = $line
        } 
    }
    

    【讨论】:

      【解决方案2】:

      抱歉,我知道这与AdminOfThings good answer 非常相似。我已经在测试它所以想我会发布。

      $text = 
      @"
      Line1
      Line2
      Line3
      Line4
      Line5
      Reference(s) :
      Line5
      Line7
      Line8
      Line9
      Line10
      "@
      
      ($text -Split "Reference\(s\) :")[0]
      

      这也有效,但出于各种原因,建议使用 PowerShell 原生拆分运算符:

      $text.Split([String[]]"Reference(s) :", [StringSplitOptions]::None )[0]
      

      【讨论】:

        【解决方案3】:

        这里是使用 where 方法。如果这是整行,您可以只使用 -eq 而不是 -match。

        get-content file
        
        before1
        before2
        before3
        Reference(s) :
        after1
        after2
        after3
        
        
        (get-content file).where({$_ -match [regex]::escape('Reference(s) :')},'Until')
        
        before1
        before2
        before3
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-07
          • 2018-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多