原始数据:
<?xml version="1.0"?>
<CascadedExtractFileData>
<Country>
<IsoCountryCode>IN</IsoCo
untryCode>
<Provider>
<ItuCode>CASCADED_PROV</ItuCode>
<AccessInterconnect>
<CASCADE
D_INTERCONNECT_ID>50</CASCADED_INTERCONNECT_ID>
<TailTechnology>
<CASCADED_ACCESS_
METHOD_ID>1</CASCADED_ACCESS_METHOD_ID>
</TailTec
hnology></Access
Interconnect></
Provider><
/Country>
</C
ascad
edExtractFileData>
必需如:
<?xml version="1.0"?>
<CascadedExtractFileData>
<Country>
<IsoCountryCode>
IN
</IsoCountryCode>
<Provider>
<ItuCode>
CASCADED_PROV
</ItuCode>
<AccessInterconnect>
<CASCADED_INTERCONNECT_ID>
50
</CASCADED_INTERCONNECT_ID>
<TailTechnology>
<CASCADED_ACCESS_METHOD_ID>
1
</CASCADED_ACCESS_METHOD_ID>
</TailTechnology>
</AccessInterconnect>
</Provider>
</Country>
</CascadedExtractFileData>
我需要新行上的每个标记<>
和</>
以及<>IN</>
之间的数据,例如IN
也在新线上。我需要一个结构完整的XML格式。
我需要使用Unix工具的解决方案:grep
,sed
或awk
。
答案 0 :(得分:2)
此行将修复无效xml文件中的问题:
awk '{s=s $0}END{gsub(/></,">\n<",s);s=gensub(/>([^ \n>]*)</,">\n\\1\n<","g",s);print s}' file
输出:
<?xml version="1.0"?>
<CascadedExtractFileData>
<Country>
<IsoCountryCode>
IN
</IsoCountryCode>
<Provider>
<ItuCode>
CASCADED_PROV
</ItuCode>
<AccessInterconnect>
<CASCADED_INTERCONNECT_ID>
50
</CASCADED_INTERCONNECT_ID>
<TailTechnology>
<CASCADED_ACCESS_METHOD_ID>
1
</CASCADED_ACCESS_METHOD_ID>
</TailTechnology>
</AccessInterconnect>
</Provider>
</country>
</cascadedExtractFileData>
答案 1 :(得分:-1)
以下命令删除换行符(以修复XML标记),然后将结果传递给xmllint,它可以格式化结果:
cat data.xml | tr -d '\n' | xmllint -format -
关注输出:
<?xml version="1.0"?>
<CascadedExtractFileData>
<Country>
<IsoCountryCode>IN</IsoCountryCode>
<Provider>
<ItuCode>CASCADED_PROV</ItuCode>
<AccessInterconnect>
<CASCADED_INTERCONNECT_ID>50</CASCADED_INTERCONNECT_ID>
<TailTechnology>
<CASCADED_ACCESS_METHOD_ID>1</CASCADED_ACCESS_METHOD_ID>
</TailTechnology>
</AccessInterconnect>
</Provider>
</Country>
</CascadedExtractFileData>
我的结果文件的格式与您的要求不一致,但我会提交格式更清晰。
从命令行操作XML时,xmllint程序是一个非常有用的工具。除了能够验证和格式化XML之外,它还可以用于使用xpath进行搜索。