string sed não corresponde. Por que?

string sed não corresponde. Por que?

Estou procurando corresponder a qualquer string que contenha uma [DEBUG]instrução e que eventualmente terá uma ": "string a seguir. Se houver várias ": "strings seguindo-o, quero combinar o primeiro. A ideia é então colorir tanto a [DEBUG]declaração quanto o que está próximo à primeira ": ".

Um exemplo seria:

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

deve ser traduzido para:

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

Para isso, pensei que a seguinte string sed replace seria suficiente, mas não é:

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

Perdi horas com isso, mas infelizmente não corresponde à string mostrada acima. Alguma pista sobre o porquê?

Responder1

Você está tentando combinar, para o grupo 2, qualquer coisa, exceto a :até a :, mas há dois pontos no horário, então você não corresponde. Você pode tentar substituir [^:]por .e provavelmente obter os mesmos resultados, a menos que tenha :algum outro lugar na linha, então ele corresponderá até a última ocorrência dessa string.

Talvez um padrão melhor, porém, seja

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

informação relacionada