替换两个字符串之间的文本(PowerShell)

3
最初的回答: 我有一个问题,我卡在这里了...
我有一个名为xml_data.txt的文件和另一个名为entry.txt的文件。
我想替换<core:topics></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
使用 $test = Get-Content -Path ./xml_data.txt -Raw,以及 $pattern = "(?s)<core:topics>(.*?)</core:topics>" - Wiktor Stribiżew
5
不要使用正则表达式解析XML数据。应该使用PowerShell内置的XML解析器来操作XML数据。请注意,你的数据显然使用了命名空间,所以需要小心处理。 - Ansgar Wiechers
@WiktorStribiżew 如果我有多个输入,我该如何循环? - Sabbir Ahmed
@WiktorStribiżew 不用担心,我搞定了!你的第一个解决方案起作用了,谢谢 :) - Sabbir Ahmed
我添加了一个答案,请查看。 - Wiktor Stribiżew
显示剩余2条评论
1个回答

3
这里有三个主要问题:
- 您逐行读取文件,但文本块是多行字符串。 - 您的正则表达式不匹配换行符,因为默认情况下 . 不匹配换行符。 - 此外,当使用动态替换模式进行替换时,字面正则表达式模式必须以 $ 结尾。或者使用简单字符串 .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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接