代码之家  ›  专栏  ›  技术社区  ›  Bob van Luijt

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

  •  1
  • Bob van Luijt  · 技术社区  · 7 年前

    我使用以下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 回复  |  直到 7 年前
        1
  •  1
  •   cody    7 年前

    实现你想要的 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中 格雷普 , -P 将给定模式解释为 PCRE ,这将启用传统POSIX正则表达式语言中不可用的功能。其中之一是“积极的后视”,由 (?<=...) 这实际上告诉regex引擎后退一步,看看lookbehind中的文本是否可以在那里匹配,但实际上不匹配。这允许您对给定字符串进行“锚定”匹配,但不捕获它们。

    这个 -o 标记为 格雷普 简单地告诉它只打印给定输入的匹配部分。

    结合起来,这两个标志允许我们使用 TOKEN= 在模式中锚定匹配,但只打印真正的令牌数据。

    推荐文章