如何使sed(使用bash)在换行符处停止?

时间:2018-12-16 20:13:17

标签: bash sed

我正在使用以下sed命令从Docker组成的日志文件中获取一个变量:

sudo cat $(docker inspect --format='{{.LogPath}}' xxxxx) | grep -s TOKEN|sed 's/.*TOKEN=//'

这很好,但是返回:

57ac8392-1ecc-4e17-9350-c9c866ac832b\n","stream":"stderr","time":"2018-12-16T19:55:54.032838023Z"}

TOKEN的确是:57ac8392-1ecc-4e17-9350-c9c866ac832b。但是我不确定如何将换行符(\n改为 仅包含UUID后将其断开。

1 个答案:

答案 0 :(得分:1)

要通过sed实现所需的功能,您需要捕获模式中的令牌,并使用对它的反向引用作为替换:

$ cat data
TOKEN=57ac8392-1ecc-4e17-9350-c9c866ac832b\n","stream":"stderr","time":"2018-12-16T19:55:54.032838023Z"}

$ cat data | sed -e 's/.*TOKEN=\([-a-f0-9]\+\)\\n.*/\1/'
57ac8392-1ecc-4e17-9350-c9c866ac832b

您是否正在使用GNU grep?如果是这样,您可以单独将其定位为令牌,如下所示:

$ grep -sPo '(?<=TOKEN=)[-a-f0-9]+' < data
57ac8392-1ecc-4e17-9350-c9c866ac832b

解释:

在GNU grep中,-P将给定模式解释为PCRE,从而启用了传统POSIX正则表达式语言中不可用的功能。其中之一是由(?<=...)表示的“正向后向”,它实际上是告诉正则表达式引擎向后退一步,以查看后向内部中的文本是否可以在那里匹配,但实际上不匹配。这样,您就可以对给定字符串进行“锚定”匹配,但不能捕获它们。

-o的{​​{1}}标志只是告诉它仅打印给定输入的匹配部分。

结合使用这两个标志后,我们就可以在模式中使用grep来锚定匹配项,但只显示真实的令牌数据。