我需要替换两点之间的所有内容。
$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>
致谢
答案 0 :(得分:1)
要进行此工作,需要进行一些更改:
由于您要对多行进行替换,因此我们需要确保所有行都包含在同一字符串中,因此让我们开始吧-我们可以将-Raw
参数开关与{{1 }}:
Get-Content
接下来,我们将使用正则表达式模式-与您显示的示例内容之间存在一些差异:
$import = Get-Content C:\bookmarks.html -Raw
因此,我们要解决此问题,并确保在寻找输入字符串时对其进行了正确的转义:
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>)"
方法-因为它实际上并不支持正则表达式-因此我们将使用String.Replace()
运算符:>
-replace
$import -replace $remove,"$newbody"
我们现在唯一需要的是指示正则表达式解析器以-replace
模式处理输入-这样SingleLine
也将捕获换行符。不过,这非常简单,我们只需在正则表达式模式的开头添加一个选项标志.*?
:
s
就这样:)
$import -replace "(?s)$remove","$newbody"