我有一个嵌入了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块的最有效方法是什么(文件中可能存在许多“APPLICATION”块的实例。是替换每个块中包含的xml标记中的一些值并重写文件,使用标记中的新值保持原始内容BUT。对于这部分,示例如下。在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'
但是我希望将它变成通用的,以便父SSN和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
答案 0 :(得分:1)
这可能适合你(GNU sed):
?
这会将任何sed处理限制为包含开始和结束sed -r '/<(APPLICATION>).*<\/\1/!b;:a;s/(<((Student|Parent)SSN>)\**)[^*](.*<\/\2)/\1*\4/;ta' file
标记的那些行。
非APPLICATION
的{{1}}或Student
Parent
个标记中的每个字符都被SSN
替换。这是通过使用*
命令检查成功替换并循环回*
占位符来完成的,直到不再发生替换为止。
N.B。正则表达式使用反向引用甚至后引用中的后引用(因此需要ta
开关使最终解决方案更容易被容忍)。
答案 1 :(得分:0)
以下内容将修复您的sed
,以便输出所需的行:
sed -n '/<APPLICATION>.*<\/APPLICATION>/p' batchlog.txt >> np.out
打印:
<APPLICATION> <NAME> test </NAME> </APPLICATION>
使用给定的输入