在xml文件中搜索和替换路径

时间:2011-05-20 05:57:23

标签: replace sed

任何人都可以帮助我吗?

我正在尝试编写一个shell脚本,在XML文件中搜索路径:

<string>User/MyUser/Library/Folder/File.txt<string>

然后用另一条路径替换该路径:

<string>/Library/CustomFolder/CustomFile.txt<string>

我要搜索的路径是可变的,但始终包含单词Library。

有没有办法搜索>*/Library并将其替换为>/Library

然后,我想搜索Library*<并将其替换为Library/CustomFolder/CustomFile.txt<

请阅读以上内容,好像*字符指的是任何字符串......

我目前正在尝试使用sed -i到达那里(因为我想编辑文件本身而不仅仅是标准输出)但我有点像菜鸟并且在尝试测试时我一直收到错误。

到目前为止,我有:

sed -i 's/Library/TEST/g' ~/Library/Path/To/MyFile.xml

这会在l命令错误结束时返回一个额外的字符,所以我还没有尝试计算出*位...

有更好的方法可以做到这一点,还是我做错了?

提前致谢!

马特斯

3 个答案:

答案 0 :(得分:2)

当您尝试修改xml文件时,它会变得有点困难和复杂 只有sed / awk工具。如果你需要做一些更复杂的xml修改 这个解决方案可以帮助你:

如果您可以在您的计算机上安装某些软件,那么您可以尝试:

XMLStarlet:http://xmlstar.sourceforge.net/

安装完成后,您可以像这样编辑文件:

$>./xmlstarlet ed -u '/xml/table/rec[@id=1]/numField' -v 42 xml/myfile.xml

当然,这个工具允许您执行比编辑单个任务更复杂的任务 xml元素的值。哪一天可以变得非常有用。

可在此处找到完整命令/功能的列表:

http://xmlstar.sourceforge.net/doc/xmlstarlet.txt

答案 1 :(得分:1)

忽略这不是使用基于行的编辑器编辑XML文件的最佳方式(如sed所示),您可以例如这样做:

sed -i.bak 's/>[^>]*Library/>Library/;s#Library[^<]*<#Library/CustomFolder/CustomFile.txt<#' ~/Library/Path/To/MyFile.xml

sed -i.bak将在 MyFile.xml.bak 中对 MyFile.xml 进行原位编辑,以保存原始文件的备份。
我使用了两个s命令(s/>[^>]*Library/>Library/)替换>后跟除>以外的任意数量的字符,包括Library字符串>Library }。
另一个(s#Library[^<]*<#Library/CustomFolder/CustomFile.txt<#替换字符串Library后跟任意数量的字符!= <后跟< Library/CustomFolder/CustomFile.txt<。请注意我使用过#而不是通常的/,以避免必须转义替换字符串中的/字符。

答案 2 :(得分:0)

我建议:

sed -i '' 's/Library/TEST/g' ~/Library/Path/To/MyFile.xml

我认为-i选项正在吞噬你的's'命令,认为它的后备扩展

(刚刚解决了同样的问题)