在开始和结束之间替换Powershell

时间:2019-01-03 10:54:44

标签: 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 | %{$_.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>

致谢

1 个答案:

答案 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

String.Replace不支持正则表达式

然后,我们将不得不放弃您当前使用的$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"