使用sed的通配符

时间:2015-05-15 00:52:51

标签: regex sed

我有一个日志文件,其中包含正常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>|

提前谢谢

2 个答案:

答案 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

注意:

  • 导入将元素名称的可变部分与[^>]*匹配,而不是.*,以确保匹配仍限于开始标记。
  • BSD / OSX 扩展正则表达式(根据POSIX扩展正则表达式)不支持正则表达式本身内的反向引用(而不是&#34; backreferences&#34;引用替换字符串中的捕获组匹配项,因此不会尝试将结束标记与一个匹配。
  • 虽然此命令适用于所述平台,但它不符合 POSIX,因为POSIX仅强制要求在Sed中支持基本正则表达式。

以上命令是使用基本正则表达式的以下 GNU Sed命令的e 等价 - 注意需要转义{{ 1}},()

|

请注意,使用替换(sed 's%<\([^>]*Name\|[^>]*SSN\|Address[^>]*\)>[^<]*%<\1>***%g' file )会使此命令可移植,因为 POSIX 基本正则表达式不支持它。