【发布时间】:2020-06-19 17:30:24
【问题描述】:
我正在尝试读取文件并忽略所有内容,直到字符匹配。有时字符匹配会与我需要的结果出现在同一行,所以我不能做 Select-Object -Skip x 其中x 是从文档返回的行数。
我尝试在结果上使用.Split('<pre>') 方法,结果有效,但我无法选择索引,因为它是返回的多行字符串。
下面是文本返回示例的开始。这是我试图从中读取数据的 HTML 响应。我不能使用Content,因为它在 ByteArray 中并且每个字符之间都有一个空格。所以我得出结论,是时候在 PowerShell 中通过 [Regex] 寻求帮助了。
我正在查看this answer,并认为我可以通过像这样替换搜索字符串来使用/.+?(?=abc)/:
(Get-Content $env:TEMP\test.txt) | ForEach-Object {
[Regex]::Match($_, "^.+(?=\<pre\>)").Value
}
那也没用。在寻找 {\d\d\d} 之类的匹配项以确保其长度为 3 位时,我可以使用正则表达式,但我不确定在这种情况下如何使用它。
这是被返回文件的开始。我需要忽略直到并包括字符 <pre> 的所有内容,然后到文件末尾的所有内容都可以。
此处返回的示例命令和结果:
PS> Get-Content $env:TEMP\test.txt
HTTP/1.1 200 OK
Content-Length: 3524
Date: Thu, 18 Jun 2020 15:00:05 GMT
Last-Modified: Fri, 19 Jun 2020 01:00:05 GMT
Server: TTWS/1.2 on Microsoft-HTTPAPI/2.0
<!doctype html><html><body>
<p>Test TCP WebServer 1.2</p>
<pre>
Directory: C:\tmp
编辑:
我现在有这个,它会删除直到并包括第一个 <pre> 标记在内的所有内容,还删除结束 </pre> 标记,但不会删除结束 </pre> 标记之后的任何内容。
(Get-Content $env:TEMP\test.txt -Raw) -replace '(?s)^.*?<pre>' -replace '<\/pre>(.+?)'
是否可以将其扩展到文件末尾?
【问题讨论】:
-
(Get-Content $env:TEMP\test.txt -Raw) -replace '(?s)^.*?<pre>'可能对你有用。 -
尝试
'(?s)^.*?(?=<pre\s*>)'匹配直到。如果想忽略并将 pre 匹配到 pre 是不同的
-
所以,本质上,你想要
标签之间的文本?
-
你想达到什么目的?
-
Get-Content $input_path -Raw | Select-String -Pattern '(?s)(?<=<pre>\s*).*?(?=\s*<pre>)' -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file
标签: regex powershell