regex - 如何使用PowerShell解析XML文件并删除两个标签之间的文本?

标签 regex powershell replace find

我有一个包含以下多个实例的文件:

<password encrypted="True">271NFANCMnd8BFdERjHoAwEA7BTuX</password>

但是对于每个实例,密码都是不同的。

我希望输出删除加密密码:

<password encrypted="True"></password>

使用PowerShell在文件中的模式的所有实例之间循环并输出到新文件的最佳方法是什么?

就像是:

gc file1.txt | (regex here) > new_file.txt

其中(这里的正则表达式)类似于:

s/"True">.*<\/pass//

最佳答案

在正则表达式中,这很容易,您可以那样做,也可以将其解析为实际的XML,这可能更合适。我将演示两种方式。在每种情况下,我们将从以下共同点开始:

$raw = @"
<xml>
    <something>
        <password encrypted="True">hudhisd8sd9866786863rt</password>
    </something>
    <another>
        <thing>
            <password encrypted="True">nhhs77378hd8y3y8y282yr892</password>
        </thing>
    </another>
    <test>
        <password encrypted="False">plain password here</password>
    </test>
</xml>
"@

正则表达式

$raw -ireplace '(<password encrypted="True">)[^<]+(</password>)', '$1$2'

要么:

$raw -ireplace '(?<=<password encrypted="True">).+?(?=</password>)', ''

XML格式

$xml = [xml]$raw

foreach($password in $xml.SelectNodes('//password')) {
    $password.InnerText = ''
}

仅替换加密的密码:

$xml = [xml]$raw

foreach($password in $xml.SelectNodes('//password[@encrypted="True"]')) {
    $password.InnerText = ''
}

说明

正则表达式1

(<password encrypted="True">)[^<]+(</password>)

Debuggex Demo

第一个正则表达式方法使用2个捕获组来捕获开始和结束标签,并用这些标签替换整个匹配项(因此省略中间部分)。

正则表达式2

(?<=<password encrypted="True">).+?(?=</password>)

Debuggex Demo

第二种正则表达式方法使用正向先行和后向。它会找到1个或多个字符,这些字符的前面是开始标签,然后是结束标签。由于环顾处是零宽度,因此不属于匹配项,因此不会被替换。

XML格式

在这里,我们使用一个简单的xpath查询来查找所有password节点。我们使用foreach循环遍历每个对象,并将其innerText设置为空字符串。

第二个版本检查加密属性是否设置为True,并且仅在这些属性上运行。

选择哪个

我个人认为XML方法更合适,因为这意味着您不必过多考虑XML语法的变化。您还可以更轻松地说明节点上指定的不同属性或不同的属性值。

与使用正则表达式相比,使用xpath可以处理XML的灵活性更高。

文件操作

我注意到您的示例读取了gc(Get-Content的缩写)使用的数据。请注意,这将逐行读取文件。

您可以使用它来将原始内容转换为一个字符串,以转换为XML或通过正则表达式进行处理:

$raw = Get-Content file1.txt -Raw

您也可以很容易地将其写出:

$raw | Out-File file1.txt

关于regex - 如何使用PowerShell解析XML文件并删除两个标签之间的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25716845/

相关文章:

c# - 替换文件路径中的分隔符

JavaScript .replace 不会替换所有出现的地方

regex - 验证器正则表达式模式输入仅接受 2-5 位数字

python - 如何使用正则表达式找到最短的重叠匹配?

powershell - 在 PowerShell 中连接或使用 heredoc 时保留换行符

java - Powershell启动进程Java PassThru

java - 如何用点之前的单词替换字符串中的点 ('.' )?

javascript - 删除没有文字的段落

regex - Google Analytics(分析)目标跟踪的正则表达式匹配

powershell - 如何为 Powershell 函数设置别名?