2

我正在尝试在任何两个连续行中搜索两个字符串并需要帮助。

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

输入文件内容:

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

期望的输出:

1. Airport
2. Rate

PSAirport关键字 in5.不在所需的输出中,因为4.并且6.没有Rate关键字。

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

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


Thanks.
4

3 回答 3

2

使用 V3:

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

从 get-help 获取内容 (V3)

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

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

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

于 2013-10-25T13:15:10.847 回答
1

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

PS> Get-Content .\lines.txt -ReadCount 2 | Where-Object {"$_" -match 'Airport.*rate' }
1. Airport
2. Rate
于 2013-10-25T14:25:51.827 回答
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

于 2013-10-25T12:42:49.877 回答