替换两个字符串 powershell 之间的文本

Replace text between two string powershell

我有一个问题一直困扰着我..

我有一个名为 xml_data.txt 的文件和另一个名为 entry.txt

的文件

我想替换 <core:topics> and </core:topics>

之间的所有内容

我写了下面的脚本

$test = Get-Content -Path ./xml_data.txt
$newtest = Get-Content -Path ./entry.txt
$pattern = "<core:topics>(.*?)</core:topics>"
$result0 = [regex]::match($test, $pattern).Groups[1].Value
$result1 = [regex]::match($newtest, $pattern).Groups[1].Value
$test -replace $result0, $result1

当我 运行 脚本输出到控制台时,它看起来没有做任何更改。

谁能帮帮我

注意:拼写错误已修复

这里主要存在三个问题:

  • 您逐行读取文件,但文本块是多行字符串
  • 您的正则表达式不匹配换行符,因为 . 默认不匹配换行符
  • 此外,在用动态替换模式替换文字正则表达式模式时,您必须始终对 $ 符号进行美元转义。或者使用简单的字符串 .Replace.

所以,你需要

  • 将整个文件读入一个变量,$test = Get-Content -Path ./xml_data.txt -Raw
  • 使用 $pattern = "(?s)<core:topics>(.*?)</core:topics>" 正则表达式(可以通过将其展开为 <core:topics>([^<]*(?:<(?!</?core:topics>).*)*)</core:topics> 来增强,以防运行速度太慢)
  • 在替换中使用$test -replace [regex]::Escape($result0), $result1.Replace('$', '$$')到"protect"$个字符,或$test.Replace($result0, $result1).