sh - 删除两个字符串之外的文本

时间:2014-08-05 13:11:21

标签: sed sh aix

我需要帮助来过滤原始日志中的部分文本:

    <variable>  
  <status type="String"><![CDATA[-1]]></status>
  <errorCode type="String"><![CDATA[[bpm]]]></errorCode>
  <mensagens type="MensagemSistema[]">
    <item>
      <msg_err type="String"><![CDATA[ERROR1-This is error: - THIS TEXT IS VARIABLE.]]</msg_err>
      <msg_err_stack type="String"><![CDATA[stack_trace]]></msg_err_stack>
    </item>
  </mensagens>
</variable>  

我想要的部分是:

<msg_err type="String"><![CDATA[ERROR1-This is error: - THIS TEXT IS VARIABLE.]]>

...而且这个文字是可变的。

我尝试用sed执行此操作,但我找不到删除两个字符串之外的文本的示例。另一件事是unix

提前谢谢 蒂亚戈

2 个答案:

答案 0 :(得分:0)

你可以试试下面的sed命令,

$ echo '<msg_err type="String"><![CDATA[ERROR1-This is error 1.]]></msg_err>' | sed 's/.*\[\([^][]*\).*/\1/g'
ERROR1-This is error 1.

答案 1 :(得分:0)

这看起来像是XML解析器的工作。 Perl模块XML::Simple能够检索您想要的数据:

perl -MXML::Simple -e '$xml = XMLin(\*STDIN); print $xml->{'mensagens'}->{'item'}->{'msg_err'}->{'content'};' < error.xml

输出:

ERROR1-This is error: - THIS TEXT IS VARIABLE.

请注意,我添加了>来关闭msg_err标记中的CDATA,因为我认为这是一个错字。