我试图去除XML文件中位于标签<KEYS>和</ KEYS>之间的所有行.
作为问题的第一步,我得到了一个正则表达式,它将匹配文件中的第一个键块,但它不会继续匹配文件中的其他块.我已经尝试在正则表达式中添加"/ g"并且我尝试了"-0777"来立刻淹没整个文件,这两种技巧都没有任何区别.下面是perl one liner:
perl -00 -ne 'print $1 if /(\s+\<KEYS\>\n\s+.*?\n\s+\<\/KEYS\>)/s' someFile.xml
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
Run Code Online (Sandbox Code Playgroud)<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>
如上所述,文件中有更多的块(长度接近五千行),但perl代码并没有弄乱任何其他块.
有什么建议?
您的单行将通过进行两项更改来执行您想要的操作:
if到while.g选项添加到正则表达式:/.../gs或者,看起来感兴趣的起始和结束标记本身在不同的行上.如果是这样,触发器操作员可能很方便:
perl -ne 'print if m{<KEYS>} .. m{</KEYS>}' DATA_FILE
Run Code Online (Sandbox Code Playgroud)
我不完全确定你的意思是"剥离所有的线条".如果你想要打印所有的KEYS元素而不打印其他元素,那么你可以去:
perl -MXML::Simple -e 'print XMLout((XMLin(join "", <>))->{KEYS})' data.xml
Run Code Online (Sandbox Code Playgroud)
要么:
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>
Run Code Online (Sandbox Code Playgroud)
即使你根本不关心结构,这比正则表达式更容易推理,不是吗?
无论如何,这是一个正则表达式版本:
perl -e '$a = join "", <>; print $a =~ m/(\s+\<KEYS\>\n\s+.*?\n\s+\<\/KEYS\>)/sg' data.xml
Run Code Online (Sandbox Code Playgroud)