首页 > 解决方案 > Powershell:删除2个字符串之间的所有内容

问题描述

得到一个包含 2 行文本的 html。

<!-- START -->
asdf
<!-- END -->

这两个标记之间可以承受任何东西及其不断变化的数据,因此它的数据始终不同。是否有可能擦除这两个之间的所有行?

尝试过正则表达式

(?sm)<!-- START -->.*?(?=^<!-- END -->)

但他总是从第一行而不是下面开始。

有人可以帮我开始使用正则表达式然后删除它吗?

标签: regexpowershell

解决方案


这里的主要问题是您在没有捕获左侧分隔符的情况下进行匹配。

要匹配和擦除两个多字符定界符之间的任意内容,您需要将两个定界符都放在环视中:

-replace '(?<=left_hand_delim).*?(?=right_hand_delim)'

或者,使用正则表达式中的捕获组和替换中的反向引用:

-replace '(left_hand_delim).*?(right_hand_delim)', '$1$2'

您可以使用

$regex='(?ms)(?<=^\s*<!-- OPC-ITEM-ENTRIES START -->\s*).*?(?=\s*<!-- OPC-ITEM-ENTRIES END -->)'
(Get-Content -raw $file) -replace $regex, '$1$2' | Set-Content $outfile

请参阅正则表达式演示 1正则表达式演示 #2(请参阅上下文选项卡)。

您必须使用-raw选项将文件内容读入单个变量,因为您需要单行s标志来.匹配任何字符,包括换行符。


推荐阅读