在开始和结束之间更换Powershell

在开始和结束之间更换Powershell,powershell,Powershell,我需要替换两点之间的所有内容 $import = Get-Content C:\bookmarks.html $newbody = Get-Content C:\newbookmarks.html $remove = '(?<=<DT><H3 ADD_DATE=""1544626193"" LAST_MODIFIED=""154649885"">Import-IE</H3>).*?(?=</DL>)' $import | %{$_.repla

我需要替换两点之间的所有内容

$import = Get-Content C:\bookmarks.html
$newbody = Get-Content C:\newbookmarks.html
$remove = '(?<=<DT><H3 ADD_DATE=""1544626193"" LAST_MODIFIED=""154649885"">Import-IE</H3>).*?(?=</DL>)'
$import | %{$_.replace($remove,"$newbody")}
我的问题是在开始之间获取所有内容:

<DT><H3 ADD_DATE=""1544626193"" LAST_MODIFIED=""154649885"">Import-IE</H3>
最后:

</DL>
包括多条线路

html示例:

<DT><H3 ADD_DATE="1544626193" LAST_MODIFIED="1546498855">Import-IE</H3>  
<DL><p>
<DT><A HREF=https://www.golem.de/ ADD_DATE="1544626193" LAST_MODIFIED="1546498842">golem.de</A>
<DT><A HREF=https://www.heise.de/ ADD_DATE="1544626193" LAST_MODIFIED="1546498842">heise online</A>
</DL>

关于使此工作正常进行所需的几项更改:

一个大的多行字符串 由于要对多行执行替换,我们需要确保所有行都包含在同一字符串中,因此让我们从这一点开始-我们可以将-Raw参数开关与Get Content一起使用:

正则表达式中的精确模式匹配 接下来是正则表达式模式本身——它与您展示的示例内容之间存在一些差异:

LAST_MODIFIED=""154649885"" # pattern has nested double-quotes and only one 5 at the end
LAST_MODIFIED="1546498855"  # input uses just one pair of double-quotes and value has two 5's at the end
因此,让我们解决这个问题,并确保在查找输入字符串时正确转义该字符串:

$remove = "(?<=$([regex]::Escape('<DT><H3 ADD_DATE="1544626193" LAST_MODIFIED="1546498855">Import-IE</H3>'))).*?(?=</DL>)"
在单线模式下使用-替换 我们现在需要做的唯一一件事是指示正则表达式解析器以单线模式处理输入-这样。*?也将捕捉新线。不过这非常简单,我们只需在正则表达式模式的开头添加一个选项标志s:

$import -replace "(?s)$remove","$newbody"
就这样:

$import = Get-Content C:\bookmarks.html -Raw
$newbody = Get-Content C:\newbookmarks.html
$remove = "(?<=$([regex]::Escape('<DT><H3 ADD_DATE="1544626193" LAST_MODIFIED="1546498855">Import-IE</H3>'))).*?(?=</DL>)"
$import -replace "(?s)$remove","$newbody"

谢谢你的详细解释。不幸的是,我无法使用Get Content-Raw,但我必须使用:[string]$import=@Get Content-Path$Path+$bookmarkshtml-join[Environment]:NewLine来解决它
$import -replace "(?s)$remove","$newbody"
$import = Get-Content C:\bookmarks.html -Raw
$newbody = Get-Content C:\newbookmarks.html
$remove = "(?<=$([regex]::Escape('<DT><H3 ADD_DATE="1544626193" LAST_MODIFIED="1546498855">Import-IE</H3>'))).*?(?=</DL>)"
$import -replace "(?s)$remove","$newbody"