0

我正在使用 Powershell 脚本自动替换 xml 文件中的一些麻烦字符,例如 & ' - £

我的脚本适用于这些字符,但我也想删除双引号字符 " 但前提是它在 xml 属性中使用(不幸的是用双引号括起来)所以我显然无法从xml 文件,因为这将阻止属性正常工作。

我的 Powershell 脚本如下:

(Get-Content C:\test\communication.xml) | 
Foreach-Object {$_ -replace "&", "+" -replace "£", "GBP" -replace "'", "" -replace "–", " "} |
Set-Content C:\test\communication.xml

我希望能够只删除构成 XML 属性的一部分的双引号,这些属性本身由一对双引号括起来,如下所示。我知道 Powershell 将每一行视为一个单独的对象,所以怀疑这应该很容易,可能通过使用条件?

下面是一个示例 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Portal> 
<communication updates="Text data with no double quotes in the attribute" />
<communication updates="Text data that "includes" double quotes within the double quotes for the attribute" />
</Portal>

在上面的示例中,我只想删除直接围绕单词的双引号,但不包括单词 Text 左侧或单词属性右侧的双引号。用于 XML 属性的单词会定期更改,但左双引号始终位于 = 符号的右侧,右双引号始终位于空格正斜杠组合的左侧/谢谢

4

1 回答 1

1

试试这个正则表达式:

"(?<!\?xml.*)(?<=`".*?)`"(?=.*?`")"

在您的代码中,它将是:

(Get-Content C:\test\communication.xml) | 
Foreach-Object {$_ -replace "&", "+" `
    -replace "£", "GBP" `
    -replace "'", "" `
    -replace "–", " " `
    -replace "(?<!\?xml.*)(?<=`".*?)`"(?=.*?`")", ""} |
Set-Content C:\test\communication.xml

这将采用前面和后面的任何"内容"(其中包含的行除外?xml)并将其替换为空。

编辑以包括正则表达式的细分;

(?<!\?xml.*)(?<=`".*?)`"(?=.*?`")

1. (?<!\?xml.*)----> Excludes any line that has "?xml" before the first quote
2. (?<=`".*?)------> Lookbehind searching for a quotation mark.  
       The ` is to escape the quotation mark, which is needed for powershell
3. `"--------------> The actual quotation mark you are searching for
4. (?=.*?`")-------> Lookahead searching for a quotation mark

有关lookbehinds 和lookaheads 的更多信息,请参阅此站点

于 2013-07-01T22:34:25.943 回答