使用Powershell替换特定字符串中的字符

时间:2013-07-01 20:04:23

标签: xml powershell replace

我正在使用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属性的单词将定期更改,但左侧双引号将始终位于=符号的右侧,右侧双引号将始终位于空格正斜杠组合的左侧 谢谢

1 个答案:

答案 0 :(得分: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 的行),并将其替换为空。

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

{{1}}

有关lookbehinds和lookaheads see this site

的更多信息