我是bash脚本的初学者,无法解决以下问题:我有一个文件,其中每一行都是一个xml文件。我想将每一行划分为几行。
例如,我想提出以下一行:
<LumiBlockCollection><Run>201556</Run><LBRange Start="1020" End="1030"/></LumiBlockCollection>
格式:
<LumiBlockCollection>
<Run>201556</Run>
<LBRange Start="1020" End="1030"/>
</LumiBlockCollection>
有谁知道如何解决这个问题?
答案 0 :(得分:3)
通常,对于适用于不同输入数据的健壮解决方案,您应该使用 XML解析器执行此任务:
基于 xmllint
的解决方案 - xmllint
是 OS X 上的标准实用程序, 部分 Linux 发行版(例如 Fedora ):
echo '<LumiBlockCollection><Run>201556</Run><LBRange Start="1020" End="1030"/></LumiBlockCollection>' \
| XMLLINT_INDENT= xmllint --format - | tail -n +2
如果您的Linux发行版不附带xmllint
,则很可能它可以与您平台的软件包管理器一起安装;例如,在基于Debian的发行版上,例如 Ubuntu :
sudo apt-get install libxml2-utils
另一种解决方案,基于第三方实用程序 xmlstarlet
:
echo '<LumiBlockCollection><Run>201556</Run><LBRange Start="1020" End="1030"/></LumiBlockCollection>' \
| xmlstarlet fo --omit-decl --noindent
获取xmlstarlet
:
brew install xmlstarlet
sudo apt-get install xmlstarlet
答案 1 :(得分:0)
这是使用sed
的简单解决方案。请注意,如果您有CDATA
个部分,则会将它们放在自己的行中:
$ xml='<LumiBlockCollection><Run>201556</Run><LBRange Start="1020" End="1030"/></LumiBlockCollection>'
$ echo $xml | sed 's/></>\n</g'
<LumiBlockCollection>
<Run>201556</Run>
<LBRange Start="1020" End="1030"/>
</LumiBlockCollection>
$