我想从日志文件中删除一些动态文本。我能够使用regex
和grep -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
答案 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