如何从 Unix 命令行在 XML 文件中添加换行符?

如何从 Unix 命令行在 XML 文件中添加换行符?

我有一个很大的 XML 文件。在 Unix 命令行中,我想在每个 后添加一个换行符>

我曾尝试使用 sed 来实现这一点,但没有成功:

sed -i '' -e's/>/>\n/' file.xml

这只会插入字母n,而不是换行符。我也尝试过\r\r\n

我怎样才能做到这一点?

(仅供参考-我在 OSX 中使用 zshell。)

答案1

脚本

用于indentxml file.xml查看、indentxml file.xml > new.xml编辑。

其中 indentxml 是

#!/usr/bin/perl
#
# Purpose: Read an XML file and indent it for ease of reading
# Author:  RedGrittyBrick 2011. 
# Licence: Creative Commons Attribution-ShareAlike 3.0 Unported License
#
use strict;
use warnings;

my $filename = $ARGV[0];
die "Usage: $0 filename\n" unless $filename;

open my $fh , '<', $filename
  or die "Can't read '$filename' because $!\n";
my $xml = '';
while (<$fh>) { $xml .= $_; }
close $fh;

$xml =~ s|>[\n\s]+<|><|gs;                       # remove superfluous whitespace
$xml =~ s|><|>\n<|gs;                            # split line at consecutive tags

my $indent = 0;
for my $line (split /\n/, $xml) {

  if ($line =~ m|^</|) { $indent--; }

  print '  'x$indent, $line, "\n";

  if ($line =~ m|^<[^/\?]|) { $indent++; }             # indent after <foo
  if ($line =~ m|^<[^/][^>]*>[^<]*</|) { $indent--; }  # but not <foo>..</foo>
  if ($line =~ m|^<[^/][^>]*/>|) { $indent--; }        # and not <foo/>

}

解析器

当然,规范的答案是使用适当的 XML 解析器。

# cat line.xml
<a><b>Bee</b><c>Sea</c><d><e>Eeeh!</e></d></a>

# perl -MXML::LibXML -e 'print XML::LibXML->new->parse_file("line.xml")->toString(1)'
<?xml version="1.0"?>
<a>
  <b>Bee</b>
  <c>Sea</c>
  <d>
    <e>Eeeh!</e>
  </d>
</a>

公用事业

但也许最简单的是

# xmllint --format line.xml
<?xml version="1.0"?>
<a>
  <b>Bee</b>
  <c>Sea</c>
  <d>
    <e>Eeeh!</e>
  </d>
</a>

答案2

没有转义序列,您需要直接使用换行符。因此对于此输入

$ cat /tmp/example 
<this is one tag><this is another tag><here again>

你必须使用

$ sed -e 's_>_&\
_g' /tmp/example

产生

<this is one tag>
<this is another tag>
<here again>

请注意,换行符必须转义(如上所示)

答案3

您的命令运行正常,但还不够。

尝试在“s”ubstitute 命令末尾添加“g”选项,让 sed 检查输入文件每一行中的所有“>”字符。

使用:

sed -i -e 's/>/>\n/g' file.xml

注意替换命令末尾的“g”。

后缀‘-i’选项的一部分是可选的,可以省略。

给出的其他答案也很好用,但你的初始尝试是正确的,尽管缺少“g”全局选项。

答案4

您为什么不使用xmllint --format可以完全按照这种方式重新格式化的方法呢?

相关内容