使用bash脚本从字符串中提取版本

使用bash脚本从字符串中提取版本,bash,Bash,我想看看雨果的本地版本 $ hugo version Hugo Static Site Generator v0.49 linux/amd64 BuildDate: 2018-09-24T10:03:17Z 用bash脚本从上面的输出中提取v0.49,哪种方法安全可靠?我可能会使用bash的内置如下所示: $ hugo version Hugo Static Site Generator v0.59.0-DEV/extended linux/amd64 BuildDate: unknown $

我想看看雨果的本地版本

$ hugo version
Hugo Static Site Generator v0.49 linux/amd64 BuildDate: 2018-09-24T10:03:17Z

用bash脚本从上面的输出中提取
v0.49
,哪种方法安全可靠?我可能会使用bash的内置
如下所示:

$ hugo version
Hugo Static Site Generator v0.59.0-DEV/extended linux/amd64 BuildDate: unknown
$ version=v0.59
$ hugo version | grep -q "${version//./\\.}" && echo "correct version"
correct version
$ version=v0.43
$ hugo version | grep -q "${version//./\\.}" || echo "incorrect version"
incorrect version

read-r\uuuuuuuuhugo\u版本<我可能会像这样使用Bash的内置
read

$ hugo version
Hugo Static Site Generator v0.59.0-DEV/extended linux/amd64 BuildDate: unknown
$ version=v0.59
$ hugo version | grep -q "${version//./\\.}" && echo "correct version"
correct version
$ version=v0.43
$ hugo version | grep -q "${version//./\\.}" || echo "incorrect version"
incorrect version

read-r\uuuuuuuuuuuhugo\u版本<也许你最好像这样使用
grep

$ hugo version
Hugo Static Site Generator v0.59.0-DEV/extended linux/amd64 BuildDate: unknown
$ version=v0.59
$ hugo version | grep -q "${version//./\\.}" && echo "correct version"
correct version
$ version=v0.43
$ hugo version | grep -q "${version//./\\.}" || echo "incorrect version"
incorrect version
grep-q
如果正则表达式匹配,则成功退出,因此可以与shell条件构造一起使用。我正在使用参数扩展将
替换为
\.
,以便可以在正则表达式中使用版本号(否则
将匹配任何字符)


解释参数扩展的工作原理(请参见
${parameter/pattern/string}
)。基本上,
${version/././\\.}
全局(
/
)将
替换为
\.
。替换字符串中需要两个
\
,因为第一个字符串会转义第二个字符串。

也许您最好像这样使用
grep

$ hugo version
Hugo Static Site Generator v0.59.0-DEV/extended linux/amd64 BuildDate: unknown
$ version=v0.59
$ hugo version | grep -q "${version//./\\.}" && echo "correct version"
correct version
$ version=v0.43
$ hugo version | grep -q "${version//./\\.}" || echo "incorrect version"
incorrect version
grep-q
如果正则表达式匹配,则成功退出,因此可以与shell条件构造一起使用。我正在使用参数扩展将
替换为
\.
,以便可以在正则表达式中使用版本号(否则
将匹配任何字符)


解释参数扩展的工作原理(请参见
${parameter/pattern/string}
)。基本上,
${version/././\\.}
全局(
/
)将
替换为
\.
。替换字符串中需要两个
\
,因为第一个字符串会转义第二个字符串。

一个
sed
表达式可以相当通用,只要您的版本保持为

v[any number of digits].[any number of digits]
要使用
sed
,只需将
hugo version
的输出通过管道传输到
sed
表达式,例如

$ hugo version | sed 's/^.*\(v[0-9][0-9]*[.][0-9][0-9]*\).*$/\1/'
示例使用/输出

您的输出将导致:

$ hugo version | sed 's/^.*\(v[0-9][0-9]*[.][0-9][0-9]*\).*$/\1/'
v0.49
您可以使用命令替换在变量中捕获结果,例如

解释
sed
表达式

sed
表达式的细分是正常替换
s/find/replace/
,其中:

  • find
    是:
    • ^.*
      -以及开头的字符数
    • \(
      -开始一个捕获组以保存以下内容
    • v
      -字符
      'v'
    • [0-9][0-9]*
      -至少一位数字后跟零位或多位数字
    • [.]
      -小数点(或句点),后跟
    • [0-9][0-9]*
      -至少一位数字后跟零位或多位数字
    • \)
      -结束保存捕获内容的捕获组
    • *$
      -字符串末尾的所有字符
  • replace
    是:
    • \1
      对来自第一个捕获组的文本的单个反向引用

这就是它的范围。使用单个反向引用的正常替换,其对
v0.49
的作用与对
v243.871
的作用相同,只要版本保持为

v[any number of digits].[any number of digits]
要使用
sed
,只需将
hugo version
的输出通过管道传输到
sed
表达式,例如

$ hugo version | sed 's/^.*\(v[0-9][0-9]*[.][0-9][0-9]*\).*$/\1/'
示例使用/输出

您的输出将导致:

$ hugo version | sed 's/^.*\(v[0-9][0-9]*[.][0-9][0-9]*\).*$/\1/'
v0.49
您可以使用命令替换在变量中捕获结果,例如

解释
sed
表达式

sed
表达式的细分是正常替换
s/find/replace/
,其中:

  • find
    是:
    • ^.*
      -以及开头的字符数
    • \(
      -开始一个捕获组以保存以下内容
    • v
      -字符
      'v'
    • [0-9][0-9]*
      -至少一位数字后跟零位或多位数字
    • [.]
      -小数点(或句点),后跟
    • [0-9][0-9]*
      -至少一位数字后跟零位或多位数字
    • \)
      -结束保存捕获内容的捕获组
    • *$
      -字符串末尾的所有字符
  • replace
    是:
    • \1
      对来自第一个捕获组的文本的单个反向引用

这就是它的范围。使用单一反向参考的正常替代,其对
v0.49
的作用与对
v243.871
的作用相同,因为您不控制
hugo
,因此无法保证任何东西都是经得起未来考验的。仅供记录,在我的系统上,
hugo版本
的输出是
hugo静态站点生成器v0.59.0-DEV/extended linux/amd64 BuildDate:unknown
,因此,您可能需要小心此处发布的任何解决方案。您希望如何处理输出?@TomFenech如果版本不符合我的预期,我希望退出1并停止脚本,因为您无法控制
hugo
,您无法保证任何内容都是经得起未来考验的。仅供记录,在我的系统上,
hugo版本
的输出是
hugo静态站点生成器v0.59.0-DEV/extended linux/amd64 BuildDate:unknown
,因此,您可能需要注意此处发布的任何解决方案。您想对输出做什么?@TomFenech如果版本不符合我的预期,我想退出1并停止脚本。谢谢-您介意在版本后分解斜线和点吗