使用sed搜索和替换正则表达式

时间:2016-11-11 10:53:35

标签: regex bash awk sed

我想从日志文件中删除一些动态文本。我能够使用regexgrep -oP来提取它,但是,相同的正则表达式无法正常工作 使用sed命令。

示例数据:(仅为方便阅读ABCDEF和LMNOP之间的关注数据)

XXX  2 13:53:35 XXXX0-0-0 XXXXXXXX[3513]:  ABCDEF[XXXX]: 1472846015.555671: LMNOP(79): XXXXXXXXXXXXX - XXXXXX XX XXX XXX XXXXX XX XXXXX XXXX XXX XXXX XXX

以下是我要从日志文件中删除的数据。我可以使用正则表达式+ grep提取它:

grep -Po ']: [0-9]{10}\.[0-9]{6}:' sample
]: 1472846015.555671:

现在,如果我使用相同的正则表达式与sed命令,它没有帮助。任何建议?

我在sed中使用了以下命令,它返回了未更改的文件。

sed "s/]: [0-9]{10}\.[0-9]{6}://" input

awk '{gsub(/]: [0-9]{10}\.[0-9]{6}:/,"")}1' input

我需要以下输出:

XXX  2 13:53:35 XXXX0-0-0 XXXXXXXX[3513]:  ABCDEF[XXXX LMNOP(79): XXXXXXXXXXXXX - XXXXXX XX XXX XXX XXXXX XX XXXXX XXXX XXX XXXX XXX

或更好:

XXX  2 13:53:35 XXXX0-0-0 XXXXXXXX[3513]:  ABCDEF[XXXX]::LMNOP(79): XXXXXXXXXXXXX - XXXXXX XX XXX XXX XXXXX XX XXXXX XXXX XXX XXXX XXX

2 个答案:

答案 0 :(得分:2)

进入sed使用:

sed "s/]: [0-9]\{10\}\.[0-9]\{6\}: /]::/" input
" s /#1 /#2 /"指令搜索模式,但您需要转义大括号(\{\})。然后将其替换为#2,这将向后添加]:,因为它在搜索模式中。如果您需要::,请将其添加到替换模式中,如上所述。

但也许你不需要搜索和替换]:,只需用命令替换数字和点到:(它适用于你的例子)

sed "s/ [0-9]\{10\}\.[0-9]\{6\}: /:/" input

答案 1 :(得分:1)

您可以选择使用带有扩展正则表达式的sed。但请注意,扩展的正则表达式是GNU扩展,因此可能无法移植。这与@Konstantin Morenko建议的sed相同,但没有{}的反斜杠。扩展正则表达式选项为-r--regexp-extended

sed -r "s/ [0-9]{10}\.[0-9]{6}: /:/" input