在两个字符串Powershell之间替换文本

时间:2019-08-20 11:23:23

标签: regex powershell replace file-get-contents

我有一个非常棘手的问题。

我有一个名为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

当我运行脚本时,它输出到控制台上似乎没有任何更改。

有人可以帮帮我吗

注意:错字已修正

1 个答案:

答案 0 :(得分:1)

这里有三个主要问题:

  • 您逐行读取文件,但文本块是多行字符串
  • 您的正则表达式与换行符不匹配,因为默认情况下.与换行符不匹配
  • 此外,文字正则表达式模式在使用动态替换模式进行替换时必须始终用美元转义$符号。或使用简单的字符串.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('$', '$$')来“保护”替换中的$个字符,即$test.Replace($result0, $result1)