[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] PowerShell不规则xml文件的修改

有一个不规则的xml文件b.txt 内容如下:-------------------------------------------------------------------
<Que K="Pro">
  <Reference></Reference>
  <Reference></Reference>
  <Reference></Reference>
</Que>
美国人
乌克兰人
俄罗斯人

-------------------------------------------------------------------
我想把 日本人 三个字清空掉
如果直接用[xml]类型加载b.txt会报错, 正好刚刚从went大侠那里学了点正则用上了, 把xml的部分取出来了, 然后用xpath取到节点, 设置空值, 但是, 不知道怎么写回去了, 请求高手支招, 提前感谢!

代码如下:
  1. $s = gc b.txt -enc UTF8 -raw
  2. $s -match '(?s)<Que K="Pro">(.*?)</Que>'
  3. if ($s -match '(?s)<Que K="Pro">(.*?)</Que>')
  4. {        $x = $matches[0]
  5.         [xml]$x | Select-Xml -XPath "/Que/Reference" |
  6.         foreach { $_.node.InnerXML = "" }
  7. }
复制代码
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

用不到xml
  1. $s -replace '(?<=<Reference>).*?(?=</Reference>)',''
复制代码

TOP

回复 2# went


感谢大侠指引,  这个小例子, 就是想知道有什么办法, 原位置写回去, 实际例子中, 节点处理比较多
如果能原位置写回去, 把匹配出来的这部分字符串, 进行搜索替换,  然后就方便多了, 甚至: 如果能定义为一个函数, 我给这个函数三个参数: 正则, 要搜的字符, 要替的字符, 它就能一步执行, 碉堡了
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

  1. $s -replace '(?<=<Reference>).*?(?=</Reference>)','新数据'
复制代码
1

评分人数

    • 5i365: 技术牛X, 乐于分享技术 + 1

TOP

回复 4# went


大侠的正则匹配+替换干净利索!
我上面提到的这个, 应用场景应该很多,

比如, 我不想全文去匹配, 我想先抽出来一部分区域, 在其中进行操作, 缩小了范围更精准


我看正则的时候, 太吃力, 貌似也看到过, 可以把搜索到的内容, 替换回去,


我稍后整理下资料打印出来详细阅读下,  若有新发现, 贴上来, 供大家参考
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 4# went


   我前面的代码有错, 现在可以写出去了, 但是没写回去, 呵呵
  1. $s = gc b.txt -enc UTF8 -raw
  2. if ($s -match '(?s)<Que K="Pro">(.*?)</Que>')
  3. {
  4. [xml]$x = $matches[0]
  5. $x | Select-Xml -XPath "/Que/Reference" |
  6. foreach { $_.node.InnerXML = "" }
  7. $x.save("new.txt")
  8. }
复制代码
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

本帖最后由 5i365 于 2022-4-4 16:54 编辑

回复 4# went


   大侠好, 我稍变了一下, 能用上面的正则修改一下,替换成下面的效果吗? 感谢前:
  <Que K="Pro">
  <Reference Relative="..\..\Apple.Doc.docx">日</Reference>
  <Reference Relative="..\..\Apple.Li.docx">本</Reference>
  <Reference Relative="..\..\Apple.Pdf.docx">人</Reference>
</Que>
------------------------------------------------------------------------------------
后: 即分别删除了 日  本  人   再把前面标签里面属性值移进来
  <Que K="Pro">
  <Reference>\Apple.Doc.docx</Reference>
  <Reference>\Apple.License.docx</Reference>
  <Reference>\Apple.Pdf.docx</Reference>
  </Que>
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

  1. $s -replace '(?<=<Reference)\s+Relative="\.\.\\\.\.(\\.*?)">(.*?)(?=</Reference>)',('>'+'$1')
复制代码
回复 7# 5i365

TOP

本帖最后由 5i365 于 2022-4-5 14:01 编辑

回复 8# went

多谢大侠, 有点不太明白, $1 感觉好像指的第一个括号内的匹配, 能指点一下吗?
(?<=<Reference)\s+Relative="\.\.\\\.\.(\\.*?)">(.*?)(?=</Reference>)',('>'+'$1')
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

-replace的$1 类比于 -match的$Matches[1]

TOP

返回列表