我试图读取一个文件,并忽略所有直到字符匹配。有时,字符匹配将显示在与我需要的结果相同的行上,因此我无法执行Select-Object -Skip x,其中x是从文档返回的行数。
我尝试在结果上使用.Split('<pre>')方法,这是有效的,但是我无法选择索引,因为它是一个返回的多行字符串。
下面是一个文本返回示例的开始。这是一个HTML响应,我试图从其中读取数据。我不能使用Content,因为它在ByteArray中,并且在每个字符之间都有一个空格。因此,我得出结论,是时候请[Regex]在PowerShell中提供帮助了。
我正在查看this answer,并认为可以使用/.+?(?=abc)/替换如下的搜索字符串:
(Get-Content $env:TEMP\test.txt) | ForEach-Object {
[Regex]::Match($_, "^.+(?=\<pre\>)").Value
}那也没用。在寻找匹配(比如{\d\d\d} )以确保它有3位长时,我对regex没有意见,但是我不知道如何在这个实例中使用它。
这是返回文件的开始。我需要忽略所有的东西,直到包括字符<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>(.+?)'可以扩展到包含到文件的末尾吗?
发布于 2020-06-19 09:30:24
.+?模式是“懒惰”的,不贪婪的。这意味着它将匹配允许匹配的最少数量的字符。因为在模式的末尾有.+?,而且.+?匹配一个或多个字符,所以它将匹配一个字符并退出。您需要一个贪婪的量词,*或+。
此外,如果使用捕获组,则可以使用单个-replace命令实现所需的功能。
你需要用
(Get-Content $env:TEMP\test.txt -Raw) -replace '(?s)^.*?<pre>(.*?)</pre>.*', '$1'它将获取整个文件内容,并获取第一个<pre>字符串和最近的</pre>之间的文本内容。
模式细节
(?s) -一个使.匹配换行符的RegexOptions.Singleline内联修饰符,too^ - string.*?的开始-任何零或多个字符尽可能少到possible<pre> -一个<pre> text(.*?) -捕获组#1:任何零或多个字符尽可能少的possible</pre> - </pre> text.* -任何零或多个字符尽可能多(因为*是一个贪婪的quantifier).)
替换模式中的$1将恢复结果中的Group 1值(因此,它将保持不变)。
https://stackoverflow.com/questions/62453630
复制相似问题