【问题标题】:How to isolate the version number out of a string in makefile?如何从makefile中的字符串中分离出版本号?
【发布时间】:2019-11-24 13:06:12
【问题描述】:

我想从字符串“Version: 1.58.0.1ubuntu1”或任何其他版本的 Boost 中获取 Boost 库版本号 1.58。这将允许我将当前版本的 boost 与我需要匹配的特定版本进行比较。这是我目前所拥有的。

Configure:
    if ( test  -d $(Boost) )
    then
            CurrVer=$$(dpkg -s libboost-dev | grep 'Version'
            echo $$CurrVer
            echo $$CurrVer  | tr -cd [:digit:]
    else
            make DLBoostV1_58
    fi

问题是我可以将字符串缩小到数字 158011,但我不知道如何删除数字 011。

我已经阅读了 geeksforgeeks 网站上的 grep、sed 和 awk 命令,但让我走到这一步的是How to extract numbers from a string?https://askubuntu.com/questions/147474/how-can-i-find-boost-versionhttps://www.geeksforgeeks.org/tr-command-in-unix-linux-with-examples/nd

预期输出:158 结果输出:158011

【问题讨论】:

    标签: shell makefile


    【解决方案1】:

    假设您在 shell 变量CurrVer 中捕获了 Boost 版本消息,您可以使用参数扩展的 prefix-removal 选项来删除前导文本(${CurrVer##* } 删除最后一个空格字符之前的所有内容),在数组赋值 (a=(...)) 以句点 (.) 作为字段分隔符 (IFS=.) 以在右侧分隔符处拆分版本字符串。然后你只需要读回你想要的数组元素。

    例如,

    ShortVer=$( IFS=.; a=(${CurrVer##* }); echo "${a[0]}.${a[1]}" )
    

    make 转义留作练习。

    【讨论】:

      【解决方案2】:

      您可以使用gmtt,它可以根据glob-match 拆分字符串:

      include gmtt-master/gmtt-master/gmtt.mk
      
      VERSION := Version: 1.58.0.1ubuntu1
      VERS-AS-LIST := $(call glob-match,$(VERSION),Version: *.*.*.*ubuntu*)
      
      $(info $(VERS-AS-LIST))
      
      MAJOR := $(word 2,$(VERS-AS-LIST))
      MINOR := $(word 4,$(VERS-AS-LIST))
      BUGFIX := $(word 6,$(VERS-AS-LIST))
      
      $(info $(MAJOR)-$(MINOR)-$(BUGFIX))
      

      输出:

      $ make
      Version:§ 1 . 58 . 0 . 1 ubuntu 1
      1-58-0
      

      请注意,glob 模式的第一部分是 Version:,末尾有一个空格字符,该字符通过 § 字符保存(包含在 gmtt 变量 $(-spacereplace) 中,可通过函数 $(call spc-unmask,_string_) 删除)

      【讨论】:

      • 据我了解,字符串看起来是硬编码的。我可以看到我可以更改 Version 设置的变量,但在下一行,如果不是 ubuntu 怎么办?跨度>
      • @TonyRom 字符串被硬编码只是为了演示。您可以将其替换为例如VERSION := $(shell dpkg -s libboost-dev).
      • @TonyRom 第二点:版本字符串的一般格式是什么?如果没有匹配,glob-match 将产生空字符串,因此您可以将ubuntu 与例如gentoo 等通过将它们放入不同的变量中,除了正确的变量之外,这些变量都是空的。或者您只需选择分发名称作为鉴别器并继续 ifeq 等。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2017-07-22
      • 2013-02-13
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多