我想在文件中搜索一个模式,我可以很容易地做到:
GC $filename |选择字符串$pattern
然而,一旦我找到了第一个模式,以第一个匹配的位置(线)为起点,我想开始寻找第二个模式。一旦第二个模式被匹配,我想返回第一个和第二个匹配之间的所有行,丢弃匹配的行本身。
假设您的第一个模式是模式 1,第二个模式是模式 2
那么表达将是(?<=pattern1)(.*?)(?=pattern2)
(?<=pattern1)
- 这将匹配前缀模式,但将其从捕获
中排除 (?=pattern2)
- 这将匹配后缀模式,但将其从捕获中排除
可能有更优雅的方法,但这将起作用
function ParseFile
{
param([string] $FileName)
$s = gc $FileName;
for($x = 0 ; $X -lt $s.count; $x++)
{
if(-not $first ){
if($s[$x] -match "1000"){
$first =$x
}
}
else{
if($s[$x] -match "1075"){
$second = $x ;
break;
}
}
}
(($first +1) .. ($second -1))|%{
$ret += $s[$_]
}
return $ret;
}
我已经将foreach
与$foreach.Movenext()
一起使用:
foreach ($line in (Get-Content $file))
{
if ($line -match $firstTag)
{
do {
$line
$foreach.MoveNext()
} until ($foreach.current -match $secondTag)
continue
}
}
这将简单地一一返回每一行,但是如果您需要以某种方式处理结果,则可以在do-loop中做自己喜欢的事情
的一个(法国拼凑;o),想象一下文件c:\temp\gorille.txt:
C'est à travers de larges grilles,
Que les femelles du canton,
Contemplaient un puissant gorille,
Sans souci du qu'en-dira-t-on.
Avec impudeur, ces commères
Lorgnaient même un endroit précis
Que, rigoureusement ma mère
M'a défendu de nommer ici...
Gare au gorille !...
这是"州"和"endroit"之间的文字
PS > (((Get-Content -Path C:tempgorille.txt) -join "£" | Select-String -Pattern "(?=canton)(.*)(?<=endroit)").matches[0].groups[0].value) -split "£"
canton,
Contemplaient un puissant gorille,
Sans souci du qu'en-dira-t-on.
Avec impudeur, ces commères
Lorgnaient même un endroit
我用特殊字符"£"连接所有行(如果使用,请选择onather one),然后在CmdLet中使用@Alex Aza模式Select-String
然后再次拆分。
$start = select-string -Path $path -pattern $pattern1 -list |
select -expand linenumber
$end = select-string -path $path -pattern $pattern2 |
where-object {$_.linenumber -gt $start} |
sort linenumber -desc |
select -first 1 -expand linenumber
(get-content $path)[$start..($end -2)]