在xml文件中用空字符串替换字符串

时间:2017-10-06 07:14:45

标签: xml bash

我收到了一个xml文件,该文件已由其他人从数据库中提取。问题是它包含一些字符串,这些字符串会以正确的方式创建读取xml的问题。这是它的一小部分:

<gmd:fileIdentifier xmlns:gmx="http://www.isotc211.org/2005/gmx">\r\n    <gco:CharacterString>0211fa18-e0a4-4d2ed26-7580726e593c</gco:CharacterString>\r\n  </gmd:fileIdentifier>\r\n  <gmd:language>\r\n    <gco:CharacterString>eng</gco:CharacterString>\r\n  </gmd:language>\r\n  <gmd:hierarchyLevel>\r\n    <gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" />\r\n  </gmd:hierarchyLevel>\r\n  <gmd:contact>\r\n    <gmd:CI_ResponsibleParty>\r\n      <gmd:organisationName>\r\n        <gco:CharacterString>Research</gco:CharacterString>\r\n      </gmd:organisationName>\r\n      <gmd:contactInfo>\r\n        <gmd:CI_Contact>\r\n          <gmd:address>\r\n            <gmd:CI_Address>\r\n              <gmd:electronicMailAddress>\r\n                <gco:CharacterString>pippo@gmail.com</gco:CharacterString>\r\n              </gmd:electronicMailAddress>\r\n            </gmd:CI_Address>\r\n          </gmd:address>\r\n        </gmd:CI_Contact>\r\n      </gmd:contactInfo>\r\n

正如您在每个标记的末尾看到的那样,字符串“\ r \ n”就是问题所在。 我尝试使用以下bash命令:

string='\r\n'
sed -i 's/$string/''/g' test.xml

但它不起作用,没有空字符串替换$ string变量。

你能告诉我我做错了吗?

提前致谢

5 个答案:

答案 0 :(得分:1)

关注awk可能对你有帮助。

awk '{gsub(/\\r\\n/,"")} 1'  Input_file

说明: 只需使用awk的gsub实用程序,它将全局替换\ r \ n为NULL,指向此处\ r \ n和\ n是写在这里消除\特殊意义,它应该采取文字特征,而不是它的特殊含义。 1将打印行。

答案 1 :(得分:1)

$1$是Windows行结尾。

我不知道您正在使用哪种XML解析器或使用哪种编程语言,但尝试通过调用\r\n将文件首先转换为Unix格式,然后将其提供给解析器。您也可以使用常见的文本编辑器进行转换。

希望有所帮助。

答案 2 :(得分:1)

您的string变量包含\r\n作为特殊字符序列。但是你需要在输入文件中按字面意思替换它。

使用以下 sed 方法:

sed 's#\\r\\n##g' test.xml

输出(对于您当前的输入片段):

<gmd:fileIdentifier xmlns:gmx="http://www.isotc211.org/2005/gmx">    <gco:CharacterString>0211fa18-e0a4-4d2ed26-7580726e593c</gco:CharacterString>  </gmd:fileIdentifier>  <gmd:language>    <gco:CharacterString>eng</gco:CharacterString>  </gmd:language>  <gmd:hierarchyLevel>    <gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" />  </gmd:hierarchyLevel>  <gmd:contact>    <gmd:CI_ResponsibleParty>      <gmd:organisationName>        <gco:CharacterString>Research</gco:CharacterString>      </gmd:organisationName>      <gmd:contactInfo>        <gmd:CI_Contact>          <gmd:address>            <gmd:CI_Address>              <gmd:electronicMailAddress>                <gco:CharacterString>pippo@gmail.com</gco:CharacterString>              </gmd:electronicMailAddress>            </gmd:CI_Address>          </gmd:address>        </gmd:CI_Contact>      </gmd:contactInfo>

答案 3 :(得分:1)

必须转义

\,因为sed中的\r序列更改为回车符

string='\\r\\n'

也可以在双引号之间进行变量扩展,但不在引号引号

之间进行
sed -i "s/$string//g" test.xml

一般情况下请注意,如果包含/,则因为注入而无法使用任何字符串,这是代码生成的一般问题。

答案 4 :(得分:1)

试试这个:

sed 's/\\r\\n//g' test       #test has the line


[user@ip check]$ sed 's/\\r\\n//g' test
<gmd:fileIdentifier xmlns:gmx="http://www.isotc211.org/2005/gmx">  <gco:CharacterString>0211fa18-e0a4-4d2ed26-7580726e593c</gco:CharacterString> </gmd:fileIdentifier>  <gmd:language>    <gco:CharacterString>eng</gco:CharacterString>  </gmd:language>  <gmd:hierarchyLevel>    <gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" />  </gmd:hierarchyLevel>  <gmd:contact>    <gmd:CI_ResponsibleParty>      <gmd:organisationName>        <gco:CharacterString>Research</gco:CharacterString>      </gmd:organisationName>      <gmd:contactInfo>        <gmd:CI_Contact>          <gmd:address>            <gmd:CI_Address>              <gmd:electronicMailAddress>                <gco:CharacterString>pippo@gmail.com</gco:CharacterString>              </gmd:electronicMailAddress>            </gmd:CI_Address>          </gmd:address>        </gmd:CI_Contact>      </gmd:contactInfo>