【问题标题】:shell command to truncate/cut a part of stringshell命令截断/剪切字符串的一部分
【发布时间】:2013-04-23 11:58:51
【问题描述】:

我有一个包含以下内容的文件。我得到了打印版本号的命令。但我需要截断版本文件中的最后一部分

file.spec:

Version: 3.12.0.2

使用的命令:

VERSION=($(grep -r "Version:" /path/file.spec | awk  '{print ($2)}'))

echo $VERSION

当前输出:3.12.0.2

所需输出:3.12.0

【问题讨论】:

    标签: shell awk grep cut


    【解决方案1】:

    如果您的 shell 符合 POSIX 标准(应该如此)并支持 parameter expansion,那么对于这个简单的任务,绝对不需要像 awksed 等外部工具:

    $ cat file.spec
    Version: 3.12.0.2
    $ version=$(<file.spec)
    $ version="${version#* }"
    $ version="${version%.*}"
    $ echo "${version}"
    3.12.0
    

    【讨论】:

      【解决方案2】:

      试试这个:

      VERSION=($(grep -r "Version:" /path/file.spec| awk  '{print ($2)}' | cut -d. -f1-3))
      

      使用字段分隔符 (-d) 剪切拆分字符串,然后使用 -f 参数选择所需的字段。

      【讨论】:

      • 您可以省略 cut 命令中的 1awk 语句中的括号,使其更短:VERSION=($(grep -r "Version:" /path/file.spec| awk '{print $2}' | cut -d. -f-3))
      【解决方案3】:

      您可以使用这个单一的awk 脚本awk -F'[ .]' '{print $2"."$3"."$4}'

      $ VERSION=$(awk -F'[ .]' '{print $2"."$3"."$4}' /path/file.spec)
      
      $ echo $VERSION
      3.12.0
      

      或者这个单曲grep

      $ VERSION=$(grep -Po 'Version: \K\d+[.]\d+[.]\d' /path/file.spec)
      
      $ echo $VERSION
      3.12.0
      

      但您永远不需要同时使用 grepawk

      【讨论】:

        【解决方案4】:

        如果你只 grep 单个文件,-r 没有意义。

        同样基于命令行的输出,这个 grep 应该可以工作:

        grep -Po '(?<=Version: )(\d+\.){2}\d+' /path/file.spec
        

        给你:

        3.12.0
        

        \K 也不错。用于固定/非固定长度的后视。 (自 PCRE 7.2 起)。关于它还有另一个答案。但我觉得如果固定长度,后视更容易阅读。

        【讨论】:

          猜你喜欢
          • 2011-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-30
          • 1970-01-01
          • 2015-07-17
          相关资源
          最近更新 更多