如何使用bash脚本将xml行分成几行?

时间:2014-05-20 19:39:13

标签: bash

我是bash脚本的初学者,无法解决以下问题:我有一个文件,其中每一行都是一个xml文件。我想将每一行划分为几行。

例如,我想提出以下一行:

<LumiBlockCollection><Run>201556</Run><LBRange Start="1020" End="1030"/></LumiBlockCollection>

格式:

<LumiBlockCollection>
<Run>201556</Run>
<LBRange Start="1020" End="1030"/>
</LumiBlockCollection>

有谁知道如何解决这个问题?

2 个答案:

答案 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

  • OSX :使用brew install xmlstarlet
  • 通过Homebrew安装
  • Linux :很可能它可以与您平台的软件包管理器一起安装;例如,在基于Debian的发行版上,例如 Ubuntu 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>
$