找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 15993|回复: 9

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

[复制链接]
发表于 2022-4-1 21:52:08 | 显示全部楼层 |阅读模式
有一个不规则的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. }
复制代码
发表于 2022-4-1 22:28:22 | 显示全部楼层
用不到xml
  1. $s -replace '(?<=<Reference>).*?(?=</Reference>)',''
复制代码
 楼主| 发表于 2022-4-1 22:35:59 | 显示全部楼层
回复 2# went


感谢大侠指引,  这个小例子, 就是想知道有什么办法, 原位置写回去, 实际例子中, 节点处理比较多
如果能原位置写回去, 把匹配出来的这部分字符串, 进行搜索替换,  然后就方便多了, 甚至: 如果能定义为一个函数, 我给这个函数三个参数: 正则, 要搜的字符, 要替的字符, 它就能一步执行, 碉堡了
发表于 2022-4-1 22:43:37 | 显示全部楼层
  1. $s -replace '(?<=<Reference>).*?(?=</Reference>)','新数据'
复制代码

评分

参与人数 1技术 +1 收起 理由
5i365 + 1 技术牛X, 乐于分享

查看全部评分

 楼主| 发表于 2022-4-1 23:05:36 | 显示全部楼层
回复 4# went


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

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


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


我稍后整理下资料打印出来详细阅读下,  若有新发现, 贴上来, 供大家参考
 楼主| 发表于 2022-4-1 23:30:27 | 显示全部楼层
回复 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. }
复制代码
 楼主| 发表于 2022-4-4 16:52:42 | 显示全部楼层
本帖最后由 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>
发表于 2022-4-4 20:43:25 | 显示全部楼层
  1. $s -replace '(?<=<Reference)\s+Relative="\.\.\\\.\.(\\.*?)">(.*?)(?=</Reference>)',('>'+'$1')
复制代码
回复 7# 5i365
 楼主| 发表于 2022-4-5 13:57:03 | 显示全部楼层
本帖最后由 5i365 于 2022-4-5 14:01 编辑

回复 8# went

多谢大侠, 有点不太明白, $1 感觉好像指的第一个括号内的匹配, 能指点一下吗?
(?<=<Reference)\s+Relative="\.\.\\\.\.(\\.*?)">(.*?)(?=</Reference>)',('>'+'$1')
发表于 2022-4-5 21:57:15 | 显示全部楼层
-replace的$1 类比于 -match的$Matches[1]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 02:51 , Processed in 0.011110 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表