#!/usr/bin/perl use strict; use warnings; use vars qw($strip $text); $text = ''; for (<>) { /^(.*?<.> )([\w-]+|\S+)(.*?)$/ or next; my $level = length $1; my $op = lc $2; my $pv = (grep defined(), $3 =~ /[IN]V (\d+)|PV "((?:\\"|[^"])*)"/)[0]; if ( not defined $strip ) { $strip = $level; $level = 0; } else { $level -= $strip; $level /= 3; } $text .= (" " x $level) . "$op@{[ defined $pv ? qq[ $pv] : '' ]}\n"; } while ( $text =~ /^(\s*)(?:ex-|null).*/gm ) { my $pos = $-[0]; my $level = length $1; substr( $text, $pos ) =~ s/^(.*\n)// or next; substr( $text, $pos ) =~ /^\s{0,$level}\S/m or next; my $section = $-[0]; substr( $text, $pos, $section ) =~ s/^ //gm; } continue { pos($text) = 0; } $text =~ s/ / /g; print $text;