gpt4 book ai didi

bash - 解析变更日志并提取版本的变更

转载 作者:行者123 更新时间:2023-12-03 18:52:37 25 4
gpt4 key购买 nike

我在markdown中有一个更改日志文件,其中包含我的应用程序的每个版本之间的所有更改,如下所示:

## Version 1.0.6

* first change
* second change
* third change

## Version 1.0.5

* first foo change
* second foo change

## Version 1.0.4

* and so on...

我想要的是在 中提取脚本 版本的更改内容。例如,我要提取版本 1.0.5 的更改,所以它应该打印:
* first foo change
* second foo change

理想的方式是 ./getVersionChanges version filename这两个参数:
version :提取更改的版本
filename : 要解析的文件名

如何使用 sed、awk、grep 或其他方式实现这一目标?

最佳答案

稍微复杂一点的awk解决方案,其中

  • 打印感兴趣的 block 后退出,
  • 忽略空行,
  • 不包括标题行。
  • awk -v ver=1.0.5 '
    /^## Version / { if (p) { exit }; if ($3 == ver) { p=1; next } } p && NF
    ' file

    作为脚本 getVersionChanges :
    #!/usr/bin/env bash

    awk -v ver="$1" '
    /^## Version / { if (p) { exit }; if ($3 == ver) { p=1; next } } p && NF
    ' "$2"

    解释:
  • 正则表达式条件 /^## Version /通过查找子字符串 ## Version 来匹配具有版本特定信息的行 block 的标题行在行的开头 ( ^ ),如果找到,则执行相关的代码块 ( { ... } ):
  • if (p) { exit }退出(停止处理),如果 p (print) 标志先前已设置,因为这意味着已到达感兴趣的 block 之后的 block ,即感兴趣的 block 现在已被完全处理。
  • if ($3 == ver) { p=1; next }检查标题行上的第三个空格分隔字段( $3 )是否与给定版本号匹配(通过选项 -v ver=1.0.5 传递,因此存储在变量 ver 中),如果是,则设置自定义变量 p ,用作指示是否打印行的标志,到1并移至下一行( next ),以免打印标题行本身。
    换句话说:p包含 1指示后续行已经输入了特定于版本的感兴趣 block ,并且应该(可能)打印其行。

  • 条件 p && NF如果条件匹配,则隐式打印手头的行,如果打印标志 p 就是这种情况已设置并且 ( && ) 手头的行至少有一个字段(基于反射(reflect)在内置变量 NF 中的字段数),即如果该行非空白,从而有效地跳过空白和感兴趣的 block 中的全空白行。
  • 注意 && 的两个操作数使用隐式 bool 逻辑:0 的值(未初始化的自定义变量,例如 p 默认为)是隐含的假,而任何非零值都是隐含的真。

  • 关于bash - 解析变更日志并提取版本的变更,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40450238/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com