perl one liner从xml文件中获取所有"键"

phi*_*ogg 1 regex perl

我试图去除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)

我得到这个输出:

  <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>
Run Code Online (Sandbox Code Playgroud)

如上所述,文件中有更多的块(长度接近五千行),但perl代码并没有弄乱任何其他块.

有什么建议?

FMc*_*FMc 7

您的单行将通过进行两项更改来执行您想要的操作:

  1. 更改ifwhile.
  2. g选项添加到正则表达式:/.../gs

或者,看起来感兴趣的起始和结束标记本身在不同的行上.如果是这样,触发器操作员可能很方便:

perl -ne 'print if m{<KEYS>} .. m{</KEYS>}' DATA_FILE
Run Code Online (Sandbox Code Playgroud)


Ped*_*lva 5

我不完全确定你的意思是"剥离所有的线条".如果你想要打印所有的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)