gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:40:07 28 4
gpt4 key购买 nike

我有一个日志文件,其中嵌入了 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com