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}/'

相關內容