【问题标题】:How can I remove text from start to some particular selected word in bash?如何从 bash 中的某个特定选定单词的开头删除文本?
【发布时间】:2016-04-25 17:52:16
【问题描述】:

我有一个file1.txt,内容如下:

time="2016-04-25T17:43:11Z" level=info msg="SHA1 Fingerprint=9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F"

我希望文件如下所示:
9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F

我正在使用sed 如下所示将文本从文件开头删除到 bash 中的选定单词(“指纹”)。
sed 's/^.*Fingerprint=://'

它似乎不起作用,所以请建议使用正确的命令。 它可能是也可能不是 sed

【问题讨论】:

    标签: regex linux bash shell sed


    【解决方案1】:

    使用后视来匹配下一个双引号:

    $ grep -Po '(?<=Fingerprint=)[^"]*' file
    9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F
    

    顺便说一句,您的sed 命令很好,您只需删除模式末尾多余的:

    $ sed 's/^.*Fingerprint=//' file
    9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F"
    

    这将保留引号。要摆脱它们,请匹配双引号:

    $ sed 's/^.*Fingerprint=\([^"]*\)"$/\1/' file
    9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F
    

    【讨论】:

    • 我正在尝试使用sed 's/^.*Fingerprint=//' ,但如何确保我最终没有得到引号。
    • 输出应该是9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F
    • 我正试图以grep -Po '(?&lt;=Fingerprint=)[^'\"']*' 逃避",如果我做得对,请告诉我
    • @meallhour 然后使用sed 's/^.*Fingerprint=\([^"]*\)"$/\1/',如我的更新中所述。关于 grep 方法,我的回答已经很好了,看看它是如何不打印双引号的。
    • @mealhour 随时查看所有答案。
    【解决方案2】:

    提取Fingerprint 值:

    sed 's/.*Fingerprint=\([^"]*\)".*/\1/' file1.txt
    

    输出:

    9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F
    

    捕获并输出Fingerprint= 之后和引号之前的所有字符。

    【讨论】:

      【解决方案3】:

      您可以检查 grep 中的字符:

      grep -Eo "([0-9A-F]{2}:){19}[0-9A-F]{2}" file1.txt
      

      【讨论】:

        猜你喜欢
        • 2017-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-06
        • 1970-01-01
        • 2014-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多