sed 字符串不匹配。为什么?

sed 字符串不匹配。为什么?

我正在寻找匹配包含语句的任何字符串,并且最终后面[DEBUG]会有一个字符串。": "如果它后面有几个": "字符串,我想匹配第一个。这个想法是然后为[DEBUG]语句和第一个语句旁边的内容着色": "

一个例子是:

  [thread1] [DEBUG] [2017.03.12 23:22:12] com.abc.def.Xyz: some log message: some more specific info.

应该翻译成:

  [thread1] ${RED}[DEBUG]${DEFAULT} [2017.03.12 23:22:12] com.abc.def.Xyz: ${RED}some log message.${DEFAULT}

为此,我认为以下 sed 替换字符串就足够了,但事实并非如此:

sed -r "s/(\[DEBUG\])([^:]*: )(.*)$/${RED}\1${DEFAULT}\2${RED}\3{$DEFAULT}/"

我为此浪费了几个小时,但不幸的是它与上面显示的字符串不匹配。有任何线索说明原因吗?

答案1

对于第 2 组,您试图匹配除 a:到 a之外的任何内容:,但时间中有冒号,因此您不匹配。您可以尝试将 替换[^:].,并且可能会得到相同的结果,除非该行中的其他位置有 a :,否则它将匹配直到该字符串最后一次出现。

不过,也许更好的模式是

sed -r 's/(\[DEBUG])( \[[[:digit:].: ]*] [^:]*: )(.*)/${RED}\1${DEFAULT}\2${RED}\3${DEFAULT}/'

相关内容