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