Powershell一起搜索两行中的模式字符串

时间:2013-10-25 12:27:08

标签: regex powershell match select-string

我试图在任意两行中搜索两个字符串并需要帮助。

两个搜索字符串是"Airport""Rate",示例输入文件如下所述:

输入文件的内容:

1. Airport
2. Rate
3. Some text
4. Some more text
5. Airport
6. Some text

期望的输出:

1. Airport
2. Rate

P.S。由于Airport5.没有4.关键字,因此6.中的Rate关键字不在预期输出中。

这就是我到目前为止的方式:

PS> get-content "c:\Inputfile.txt" | select-string "Airport" -context 1 | s
elect-string "Rate" > c:\airportrate.txt


Thanks.

3 个答案:

答案 0 :(得分:1)

尝试这样的事情,我已经在您的输入上测试了这个并得到了正确的输出。

$reader = [System.IO.File]::OpenText("c:\Inputfile.txt")
$prevLine = ""
try {
    for(;;) {
        $line = $reader.ReadLine()
        if ($prevLine -ne "") 
        {
            if ($line -Match "Rate") 
            { 
                if ($prevLine -Match "Airport")
                {
                    $prevLine
                    $line
                }
            }                
        }
        $prevLine = $line
    }
}
finally {
    $reader.Close()
}

到期时间:https://stackoverflow.com/a/4192419/770270

答案 1 :(得分:1)

使用V3:

$Text = Get-Content "c:\Inputfile.txt" -Raw
[regex]$regex = '(?m)(^\d+\.\sAirport.*?\n\d+\.\sRate.*?)'
$regex.Matches($Text).value

来自get-help get-content(V3)

-raw         忽略换行符并在一个字符串中返回文件的全部内容。默认情况下,文件的内容将作为由换行符分隔的字符串数组返回。

Raw是FileSystem提供程序添加到Get-Content cmdlet的动态参数。此参数仅适用于文件系统驱动器。

此参数是在Windows PowerShell 3.0中引入的。

答案 2 :(得分:1)

以两行的方式读取文件内容,将每个块转换为字符串并测试它是否符合您的条件:

PS> Get-Content .\lines.txt -ReadCount 2 | Where-Object {"$_" -match 'Airport.*rate' }
1. Airport
2. Rate
相关问题