标题: [问题求助] PowerShell不规则xml文件的修改 [打印本页]
作者: 5i365 时间: 2022-4-1 21:52 标题: PowerShell不规则xml文件的修改
有一个不规则的xml文件b.txt 内容如下:-------------------------------------------------------------------
<Que K="Pro">
<Reference>日</Reference>
<Reference>本</Reference>
<Reference>人</Reference>
</Que>
美国人
乌克兰人
俄罗斯人
-------------------------------------------------------------------
我想把 日本人 三个字清空掉
如果直接用[xml]类型加载b.txt会报错, 正好刚刚从went大侠那里学了点正则用上了, 把xml的部分取出来了, 然后用xpath取到节点, 设置空值, 但是, 不知道怎么写回去了, 请求高手支招, 提前感谢!
代码如下:- $s = gc b.txt -enc UTF8 -raw
- $s -match '(?s)<Que K="Pro">(.*?)</Que>'
-
- if ($s -match '(?s)<Que K="Pro">(.*?)</Que>')
- { $x = $matches[0]
- [xml]$x | Select-Xml -XPath "/Que/Reference" |
- foreach { $_.node.InnerXML = "" }
- }
复制代码
作者: went 时间: 2022-4-1 22:28
用不到xml- $s -replace '(?<=<Reference>).*?(?=</Reference>)',''
复制代码
作者: 5i365 时间: 2022-4-1 22:35
回复 2# went
感谢大侠指引, 这个小例子, 就是想知道有什么办法, 原位置写回去, 实际例子中, 节点处理比较多
如果能原位置写回去, 把匹配出来的这部分字符串, 进行搜索替换, 然后就方便多了, 甚至: 如果能定义为一个函数, 我给这个函数三个参数: 正则, 要搜的字符, 要替的字符, 它就能一步执行, 碉堡了
作者: went 时间: 2022-4-1 22:43
- $s -replace '(?<=<Reference>).*?(?=</Reference>)','新数据'
复制代码
作者: 5i365 时间: 2022-4-1 23:05
回复 4# went
大侠的正则匹配+替换干净利索!
我上面提到的这个, 应用场景应该很多,
比如, 我不想全文去匹配, 我想先抽出来一部分区域, 在其中进行操作, 缩小了范围更精准
我看正则的时候, 太吃力, 貌似也看到过, 可以把搜索到的内容, 替换回去,
我稍后整理下资料打印出来详细阅读下, 若有新发现, 贴上来, 供大家参考
作者: 5i365 时间: 2022-4-1 23:30
回复 4# went
我前面的代码有错, 现在可以写出去了, 但是没写回去, 呵呵
- $s = gc b.txt -enc UTF8 -raw
-
- if ($s -match '(?s)<Que K="Pro">(.*?)</Que>')
- {
- [xml]$x = $matches[0]
- $x | Select-Xml -XPath "/Que/Reference" |
- foreach { $_.node.InnerXML = "" }
- $x.save("new.txt")
- }
复制代码
作者: 5i365 时间: 2022-4-4 16:52
本帖最后由 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>
作者: went 时间: 2022-4-4 20:43
- $s -replace '(?<=<Reference)\s+Relative="\.\.\\\.\.(\\.*?)">(.*?)(?=</Reference>)',('>'+'$1')
复制代码
回复 7# 5i365
作者: 5i365 时间: 2022-4-5 13:57
本帖最后由 5i365 于 2022-4-5 14:01 编辑
回复 8# went
多谢大侠, 有点不太明白, $1 感觉好像指的第一个括号内的匹配, 能指点一下吗?
(?<=<Reference)\s+Relative="\.\.\\\.\.(\\.*?)">(.*?)(?=</Reference>)',('>'+'$1')
作者: went 时间: 2022-4-5 21:57
-replace的$1 类比于 -match的$Matches[1]
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |