我有一个日志文件,其中包含正常STDOUT中的xml,如下所示:
const &
我根据Parsing and manipulating log file with embedded xml中提供给我的解决方案成功解析。根据那里的帖子,我使用带有命令的.sed文件,如下所示:
2015-05-06 04:07:37.386 [INFO]Process:102 - Application submitted Successfully ==== 1
<APPLICATION><FirstName>Test</FirstName><StudentSSN>123456789</StudentSSN><Address>123 Test Street</Address><ParentSSN>123456780</ParentSSN><APPLICATIONID>2</APPLICATIONID></APPLICATION>
2015-05-06 04:07:39.386 [INFO] Process:103 - Application completed Successfully ==== 1
2015-05-06 04:07:37.386 [INFO]Process:104 - Application submitted Successfully ==== 1
<APPLICATION><FirstName>Test2</FirstName><StudentSSN>323456789</StudentSSN><Address>234 Test Street</Address><ParentSSN>123456780</ParentSSN><APPLICATIONID>2</APPLICATIONID></APPLICATION>
2015-05-06 04:07:39.386 [INFO] Process:105 - Application completed Successfully ==== 1
我的问题是,有没有办法在你上面的foo.sed文件中进行外卡匹配?因此,例如,如果我想匹配所有* SSN标记并用**替换那些标记,而不是为StudentSSN添加一行,而为ParentSSN添加另一行,仍然产生如下输出:
s|<FirstName>[^<]*</FirstName>|<FirstName>***</FirstName>|
s|<StudentSSN>[^<]*</StudentSSN>|<StudentSSN>***</StudentSSN>|
s|<Address>[^<]*</Address>|<Address>***</Address>|
s|<ParentSSN>[^<]*</ParentSSN>|<ParentSSN>***</ParentSSN>|
提前谢谢
答案 0 :(得分:1)
您可以使用\|
替代方案。我将分隔符更改为%
,因为:
sed -e 's%<\(FirstName\|StudentSSN\|Address\|ParentSSN\)>[^<]*</\1>%<\1>***</\1>%g'
答案 1 :(得分:1)
choroba's helpful answer适用于 GNU sed
,因为在基本正则表达式中使用\|
进行替换(隐含于只支持-r
选项的缺席。
此外,OP已表示希望使用模式来匹配类似的元素名称。
这是一个使用 扩展 正则表达式的解决方案,它应该适用于Linux(GNU Sed)和BSD / OSX平台( BSD Sed):
sed -E 's%<([^>]*Name|[^>]*SSN|Address[^>]*)>[^<]*%<\1>***%g' file
注意:
[^>]*
匹配,而不是.*
,以确保匹配仍限于开始标记。以上命令是使用基本正则表达式的以下 GNU Sed命令的e 等价 - 注意需要转义{{ 1}},(
和)
:
|
请注意,使用替换(sed 's%<\([^>]*Name\|[^>]*SSN\|Address[^>]*\)>[^<]*%<\1>***%g' file
)会使此命令不可移植,因为 POSIX 基本正则表达式不支持它。