Solución:
Texto
Usar indentxml file.xml
para ver, indentxml file.xml > new.xml
Para editar.
Donde es 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 filenamen" unless $filename;
open my $fh , '<', $filename
or die "Can't read '$filename' because $!n";
my $xml="";
while (<$fh>) { $xml .= $_; }
close $fh;
$xml =~ s|>[ns]+<|><|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/>
}
Analizador
Por supuesto, la respuesta canónica es utilizar un analizador XML adecuado.
# 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>
Utilidad
Pero tal vez lo más fácil sea
# xmllint --format line.xml
<?xml version="1.0"?>
<a>
<b>Bee</b>
<c>Sea</c>
<d>
<e>Eeeh!</e>
</d>
</a>
No hay secuencia de escape, debe usar literalmente el carácter de nueva línea. Entonces, para esta entrada
$ cat /tmp/example
<this is one tag><this is another tag><here again>
Tendrías que usar
$ sed -e 's_>_&
_g' /tmp/example
que produce
<this is one tag>
<this is another tag>
<here again>
Tenga en cuenta que la nueva línea debe escaparse (como se muestra arriba)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)