我试图在任意两行中搜索两个字符串并需要帮助。
两个搜索字符串是"Airport"
和"Rate"
,示例输入文件如下所述:
输入文件的内容:
1. Airport
2. Rate
3. Some text
4. Some more text
5. Airport
6. Some text
期望的输出:
1. Airport
2. Rate
P.S。由于Airport
和5.
没有4.
关键字,因此6.
中的Rate
关键字不在预期输出中。
这就是我到目前为止的方式:
PS> get-content "c:\Inputfile.txt" | select-string "Airport" -context 1 | s
elect-string "Rate" > c:\airportrate.txt
Thanks.
答案 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()
}
答案 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