xml - 使用 sed 更新 XML 字符串
问题描述
我有一个类似于以下的 XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<csw:GetRecordByIdResponse xmlns:csw="http://www.opengis.net/cat/csw/2.0.2">
<xmlns:gmi="http://sdi.eurac.edu/metadata/iso19139-2/schema/gmi" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:geonet="http://www.fao.org/geonetwork" gco:isoType="gmd:MD_Metadata">
<gmd:onLine>
<gmd:CI_OnlineResource>
<gmd:linkage>
<gmd:URL>http://server.test.it/geoserver/test_product/wms?SERVICE=WMS&TIME=2018-06-14T10:59:00Z&</gmd:URL>
</gmd:linkage>
<gmd:protocol>
<gco:CharacterString>OGC:WMS-1.1.1-http-get-map</gco:CharacterString>
</gmd:protocol>
<gmd:name>
<gco:CharacterString>test_product:test_product</gco:CharacterString>
</gmd:name>
<gmd:description>
<gco:CharacterString>test_product:test_product</gco:CharacterString>
</gmd:description>
</gmd:CI_OnlineResource>
</gmd:onLine>
</csw>
我想替换的内容带有以下内容的标签:
我曾经在bash中使用sed
命令:
correct_url='http://server.test.it/geoserver/test_product/wms?SERVICE=WMS&version=1.1.0&request=GetMap&layers=test_product:test_product&styles=&bbox=140442.2309,3739661.3694,1330442.2309,2564661.3694&width=768&height=576&srs=EPSG:32632&format=application/openlayers&TIME=2018-06-14T10:59:00Z&'
sed -i 's/<gmd:URL>\(.*\)<\/gmd:URL>/<gmd:URL>'"${correct_url}"'<\/gmd:URL>/' xml_file.xml
它给了我一个错误:
sed: -e 表达式 #1, char 52: `s' 的未知选项
你能告诉我我做错了什么吗?
更新:
使用@rubystallion 的建议,我试图转义所有特殊字符:
correct_url='http://server.test.it/geoserver/test_product/wms?SERVICE=WMS&version=1.1.0&request=GetMap&layers=test_product:test_product&styles=&bbox=140442.2309,3739661.3694,1330442.2309,2564661.3694&width=768&height=576&srs=EPSG:32632&format=application/openlayers&TIME=2018-06-14T10:59:00Z&'
correct_url_escaped="${correct_url//\//\\\/}"
correct_url_escaped="${correct_url_escaped//&/\\&}"
correct_url_escaped="${correct_url_escaped/\?/\?}"
correct_url_escaped="${correct_url_escaped/\?/\?}"
correct_url_escaped="${correct_url_escaped//\;/\;}"
correct_url_escaped="${correct_url_escaped//\=/\=}"
sed -i 's/<gmd:URL>\(.*\)<\/gmd:URL>/<gmd:URL>'"${correct_url_escaped}"'<\/gmd:URL>/' xml_file.xml
但我仍然收到错误:
sed: -e 表达式 #1, char 47: `s' 的未知选项
我还缺少什么吗??
解决方案
正如评论者所提到的,您可以编写更多可维护的脚本并通过使用 XML 感知工具避免出错,但让我向您展示为什么您的代码不起作用:
Bash 在执行命令之前将字符串中的变量替换为其内容,因此/
将被 sed 解析为分隔符,&
并将被解析为替换字符串中的整个匹配项。如果您正确转义特殊字符,那么您的命令将按预期工作:
correct_url='http://server.test.it/geoserver/test_product/wms?SERVICE=WMS&version=1.1.0&request=GetMap&layers=test_product:test_product&styles=&bbox=140442.2309,3739661.3694,1330442.2309,2564661.3694&width=768&height=576&srs=EPSG:32632&format=application/openlayers&TIME=2018-06-14T10:59:00Z&'
correct_url_escaped="${correct_url//\//\\\/}"
correct_url_escaped="${correct_url_escaped//&/\\&}"
token='http://server.test.it/geoserver/test_product/wms?SERVICE=WMS&TIME=2018-06-14T10:59:00Z&'
sed -i 's/<gmd:URL>\(.*\)<\/gmd:URL>/<gmd:URL>'"${correct_url_escaped}"'<\/gmd:URL>/' xml_file.xml
另外,请确保您的命令下次按照问题中的描述进行编译。您忘记在变量周围加上引号。
推荐阅读
- powershell - 即使遇到重新启动,也继续执行 powershell 脚本
- java - Groovy StreamingTemplateEngine 使用 withCredentials 函数出错
- java - postgresql 查询 where 子句中的 json 子元素或 json_exists() oracle 函数在 postgresql 中的替代
- excel - 甲骨文 | 从 Excel 连接时没有侦听器错误
- firebase - 如何使用flutter和firebase获取与我的userId相关的周围数据
- python - 比较列表中的元素和python中的字典
- javascript - 渲染组件后如何关注特定的输入文本?
- php - iframe 跨域框架错误显示
- python - 如何使用 PyCharm 在 WSL ubuntu 中调试由 bash 脚本调用的库 python 脚本
- c# - 函数外部可用的 C# 数组