【问题标题】:sh - remove text outside two stringssh - 删除两个字符串之外的文本
【发布时间】:2014-09-28 04:01:54
【问题描述】:

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

    <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

提前致谢 蒂亚戈

【问题讨论】:

  • 你的预期输出是什么?
  • 我只需要:ERROR1-This is error 1.,但我认为我的问题本质上是删除示例中行的外部文本
  • 日志是格式正确的xml吗?
  • 不要使用sed;它不是 XML 解析器。
  • 嗯,这是 aix,我认为在这个系统中没有可用的东西来制作它,这是一个客户环境。

标签: sed sh aix


【解决方案1】:

这看起来像是 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.

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

【讨论】:

  • 我试过了,但是不行……这是堆栈跟踪/运行时错误的结果,保存在系统表中。
  • 如果没有更多细节,就不可能说出原因。假设解析成功,您可能想尝试使用Data::Dumper 打印$xml 变量并准确计算出要提取的部分。如果您有更多详细信息,您应该编辑您的问题。
【解决方案2】:

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

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

【讨论】:

  • 对不起,我忘了参考一些东西,我要编辑原始消息
  • 我尝试了其他的东西,但最后我用你的方法用了 grep。这个版本的 AIX 非常有限
  • 你不需要 grep。添加 -n 作为参数并在模式末尾添加 ap 因此: sed -n 's/.*[([^][]*).*/\1/pg' --- 另外,你想要g 最后?这意味着更换多次,但我认为你只会打一次,因为 .* 最后。太好了......让它: sed -n 's/.*[([^][]*).*/\1/p'
猜你喜欢
  • 2019-01-24
  • 2015-11-10
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
相关资源
最近更新 更多