在powershell中的一个匹配之后和不同匹配之前打印行

在powershell中的一个匹配之后和不同匹配之前打印行,powershell,Powershell,我想在一些比赛之后和其他不同的比赛之前打印一些行 使用awk,我是这样做的: awk '/first match/{f=1} f; /second match/{f=0}' 是否可以使用PowerShell执行此操作?如果需要输出第二个匹配行,则可以在读取文件时执行以下操作: (Get-Content file).Where({$_ -match 'first'},'SkipUntil') | Foreach-Object { if ($_ -match 'second') {

我想在一些比赛之后和其他不同的比赛之前打印一些行

使用awk,我是这样做的:

awk '/first match/{f=1} f; /second match/{f=0}'

是否可以使用PowerShell执行此操作?

如果需要输出第二个匹配行,则可以在读取文件时执行以下操作:

(Get-Content file).Where({$_ -match 'first'},'SkipUntil') | Foreach-Object {
    if ($_ -match 'second') {
        $_; break
    }
    else {
        $_
    }
}
如果您有一个带有行数组的变量(
$content
),则可以执行以下操作:

$content.Where({$_ -match 'first'},'SkipUntil') | Foreach-Object {
    if ($_ -match 'second') {
        $_; break
    }
    else {
        $_
    }
}
说明:

Where()
方法支持表达式和模式。由脚本块
{}
表示的表达式针对每个管道对象执行。如果您的输入是一个数组,
$\uu
将包含每行的内容

-match
默认情况下执行不区分大小写的正则表达式匹配

模式
SkipUntil
表示在表达式为真之前不要输出任何内容。然后继续输出,直到处理完所有数据

当找到第二个匹配项时,该行将输出,其余行将停止处理

基本工作流程如下所示:

$content.Where({$_ -match 'first'},'SkipUntil') | Foreach-Object {
    if ($_ -match 'second') {
        $_; break
    }
    else {
        $_
    }
}
  • 从索引0(第1行)开始按顺序处理输入内容
  • 在找到第一个匹配项之前不捕获任何内容(表达式的计算结果为true)
  • 捕获的输出通过管道传输到循环中,直到找到第二个匹配项。输出包括第二个匹配项
  • 找到第二个匹配项后,停止处理数据

  • 或者,如果不需要包含第二个匹配行,代码将变得更简洁:

    (gc file).Where({$_ -match 'first'},'SkipUntil').Where({$_ -match 'second'},'Until')
    

    使用
    gc$file-Raw
    读取中的文件,然后首先使用
    -match'(?s).*?秒'
    。您需要调整它以获得多个匹配项。此代码在第一个匹配项之前都有效,但我需要文件中的所有这些匹配项。文件的结构如下:第一个匹配bla bla bla bla bla bla第二个匹配第一个匹配ololol ololol第二个匹配