xml - 从日志中解析xml的sed命令

标签 xml bash sed

我有一个日志文件,其中嵌入了 xml,我正在尝试使用 sed 解析它。发生的事情是我得到了所需的 xml,但是在获取所需的 xml 之后的行。这是一个示例文件

2015-05-06 04:07:37.386 [INFO]Process:102 - Application submitted Successfully ==== 1
<APPLICATION> <NAME> test </NAME> </APPLICATION>
2015-05-06 04:07:39.386 [INFO] Process:103 - Application completed Successfully ==== 1

我使用的sed命令是

sed -n '/<APPLICATION>/,/<\/APPLICATION>/p' batchlog.txt  >> np.out

如上所述,我得到了所需的 XML,但也得到了它后面的一行。我该如何避免这种情况?

这个问题的第二部分是,如果我要在 shell 脚本中使用它,处理每个 xml block 的最有效方法是什么(文件中可以有许多“APPLICATION” block 的实例。这个想法是替换每个 block 中包含的 xml 标记中的一些值并重新编写文件,使用标记中的新值维护原始内容。对于这部分,示例如下。在 shell 脚本中,我是解析日志文件,当我遇到 APPLICATION 标签时,我想用 * 屏蔽任何包含 SSN 的标签的值。例如:

<APPLICATION><FirstName>Test<FirstName><StudentSSN>123456789</StudentSSN><Address>123 Test Street</Address><ParentSSN>123456780</ParentSSN></APPLICATION>

现在,当脚本针对日志文件运行时,它需要在任何 *SSN 标记中查找并将值替换为 *。在命令行上执行以下 sed 命令,我可以获取 studentSSN 标签。

sed -n 's:.*<\StudentSSN>\(.*\)</StudentSSN.*:\1:p'

但我希望使其通用化,以便 parentSSN 和 studentSSN 都被拾取、替换并用旧的非 xml 行和 XML 中的这些新值写回文件。所以修改后的文件看起来像这样:

2015-05-06 04:07:37.386 [INFO]Process:102 - Application submitted Successfully ==== 1
<APPLICATION><FirstName>Test<FirstName><StudentSSN>*********</StudentSSN><Address>123 Test Street</Address><ParentSSN>*********</ParentSSN></APPLICATION>
2015-05-06 04:07:39.386 [INFO] Process:103 - Application completed Successfully ==== 1

最佳答案

这可能对你有用(GNU sed):

sed -r '/<(APPLICATION>).*<\/\1/!b;:a;s/(<((Student|Parent)SSN>)\**)[^*](.*<\/\2)/\1*\4/;ta' file

这将任何 sed 处理限制在那些同时包含开始和结束 APPLICATION 标记的行。

StudentParent SSN 标签中不是 * 的每个字符都被替换为 *。这是通过使用 ta 命令检查替换是否成功并循环回到 :a 占位符直到不再发生替换来完成的。

注意正则表达式使用大量反向引用,甚至在反向引用中使用反向引用(因此需要 -r 开关来使最终解决方案更明显地可以接受)。

关于xml - 从日志中解析xml的sed命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30228943/

相关文章:

unix - 从文件中删除空行

bash - 使用 printf 时行未正确对齐

php - 使用 PHP 生成 MySQL 数据库的 XML 输出的最佳方法是什么

Java 如何使用 JAXB 注释在 XML 中添加子元素

javascript - Web 应用程序的问题

bash - 如何在 bash 的别名中包含环境变量?

c - 如何从 shell 执行库调用命令?

linux - 使用 grep/sed/awk 其他在 unix 中过滤文件?

linux - 使用打印命令选择子域

iphone - 将 xml 数据发送到服务器并获取响应