Я не совсем уверен, что вы имеете в виду, говоря "обрезать все строки".Если вы хотите напечатать все элементы KEYS, а не другие, тогда вы идете:
perl -MXML::Simple -e 'print XMLout((XMLin(join "", <>))->{KEYS})' data.xml
или:
use XML::Simple;
my $xml = XMLin(join '', <DATA>);
print XMLout($xml->{KEYS});
__DATA__
<root>
<KEYS>
<KEY name="cone_id" type="long" nativeType="number(17)"/>
<KEY name="bar_id" type="long" nativeType="number(32)"/>
<KEY name="foo_type" type="int" nativeType="number(3)"/>
</KEYS>
<NOTKEYS1>
<KEY name="cone_id" type="long" nativeType="number(17)"/>
<KEY name="bar_id" type="long" nativeType="number(32)"/>
<KEY name="foo_type" type="int" nativeType="number(3)"/>
</NOTKEYS1>
<NOTKEYS2>
<KEY name="cone_id" type="long" nativeType="number(17)"/>
<KEY name="bar_id" type="long" nativeType="number(32)"/>
<KEY name="foo_type" type="int" nativeType="number(3)"/>
</NOTKEYS2>
<KEYS>
<KEY name="cone_id" type="long" nativeType="number(17)"/>
<KEY name="bar_id" type="long" nativeType="number(32)"/>
<KEY name="foo_type" type="int" nativeType="number(3)"/>
</KEYS>
</root>
Даже если вам не нужна структура, это немного легче рассуждать, чем регулярные выражения, не так ли?
В любом случае, вот версия регулярных выражений:
perl -e '$a = join "", <>; print $a =~ m/(\s+\<KEYS\>\n\s+.*?\n\s+\<\/KEYS\>)/sg' data.xml