任何人都可以帮助我吗?
我正在尝试编写一个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命令错误结束时返回一个额外的字符,所以我还没有尝试计算出*位...
有更好的方法可以做到这一点,还是我做错了?
提前致谢!
马特斯
答案 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元素的值。哪一天可以变得非常有用。
可在此处找到完整命令/功能的列表:
答案 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'命令,认为它的后备扩展
(刚刚解决了同样的问题)