PowerShell,解析,使用带有 -match/-like 和 -split 的特定字符串时出现问题

PowerShell, parsing, problem using a specific string with -match/-like and -split

我有一个充满多行文本的变量,我正在尝试从中解析数据。现在文本中间是一个特定的字符串“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}

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

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

有人有什么想法吗?必须有一种方法来匹配特殊字符,我还没有找到它。

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

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

由于-split使用正则表达式匹配,您必须反斜杠转义正则表达式特殊字符以按字面匹配它们。这里 () 是特殊的。

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


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

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

抱歉,我知道这与 非常相似。我已经在测试它了,所以我想 post.

$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]

这里是使用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