【问题标题】:Use Powershell to replace characters within a specific string使用 Powershell 替换特定字符串中的字符
【发布时间】:2013-07-01 20:04:23
【问题描述】:

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

【问题讨论】:

  • 你可以菊花链-replace操作($_ -replace "&amp;","+" -replace "£","GBP" ...)。不需要为每个替换单独循环。
  • 非常感谢 Ansgar 的小提示,我会修改我的代码。关于替换特定双引号的任何想法?
  • 文件是否总是每行只有一个属性?
  • 这不是有效的 XML。您可以修复源吗? XML 属性中的双引号应编码为“,例如,&lt;communication updates="Text data the &amp;quot;includes&amp;quot; double quotes within the double quotes." /&gt;
  • @ splattered- 谢谢,我知道它不是有效的 XML,这就是我希望能够删除流氓字符的原因。人类用户在文本编辑器中手动修改 XML 属性并保存 XML 文件,因此我无法修复源。流氓字符和糟糕的 XML 是不可避免的。然后将 XML 文件同步到平板电脑和 HTML 本地托管网页使用 Javascript 解析 XML 并将属性的内容作为文本添加到页面。如果用户输入了非法字符,则属性不会显示,因为无法解析 XML,或者像 ' 和 £ 这样的格式不正确

标签: xml powershell replace


【解决方案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

有关后向和前瞻的更多信息see this site

【讨论】:

  • 嗨尼克,我现在有一个额外的挑战(可能是一个很小的挑战),非常感谢你的帮助......我已安排这个脚本以固定频率运行,但我现在想做的是每次对其中一个 XML 文件进行更改时运行它。我有一个应用程序可以很好地处理这个问题,但是由于脚本每次运行时都会设置字符替换(保存文件),所以每次都会将其视为一个新文件并创建一个无限循环。理想情况下,我希望仅在替换任何字符时才发生 Set -Content 命令。希望这是可能的。再次感谢
  • @ladders81 应该不难。只需使用communication.xml 中的所有内容创建一个变量并在其上运行替换,保存到一个新变量。只需比较两者,如果相同,则不执行任何操作,如果不同,则执行 set-content。如果您不确定如何执行此操作,请创建一个新问题,我相信人们将能够指导您。
猜你喜欢
  • 1970-01-01
  • 2012-08-09
  • 2013-12-08
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多