![sed 字符串不匹配。为什么?](https://linux22.com/image/109598/sed%20%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%8D%E5%8C%B9%E9%85%8D%E3%80%82%E4%B8%BA%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我正在寻找匹配包含语句的任何字符串,并且最终后面[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}/'