解析更改日志并提取版本的更改

时间:2016-11-06 14:08:32

标签: bash shell awk sed sh

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

./getVersionChanges version filename

我想要的是在脚本中提取版本的更改内容。例如,我想提取版本1.0.5 的更改,因此它应该打印:

version

理想的方式是filename这两个参数:

enum {NumDimensons = 4}; struct ArrayLocation { int16_t location[NumDimensions]; }; typedef uint8_t ArrayValue; // Hash Table with key as ArrayLocation and value as ArrayValue :提取更改的版本

get():要解析的文件名

我如何用sed,awk,grep或其他方法实现这一目标?

4 个答案:

答案 0 :(得分:4)

更精细的awk解决方案,

  • 在打印出感兴趣的块后退出,
  • 忽略空行,
  • 不包括标题行。
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"

答案 1 :(得分:3)

相当短的awk脚本将提取您想要的块。

#!/bin/sh

awk -v version="$1" '/## Version / {printit = $3 == version}; printit;' "$2"

样本:

$ ./getVersionChanges 1.0.5 filename
## Version 1.0.5

* first foo change
* second foo change

$

答案 2 :(得分:1)

试试这个。您可以将/ tmp / data替换为您的文件名和版本1.0.5'用你的搜索模式。请注意,这不会删除任何空行。

sed  '1,/Version 1.0.5/d;/Version/Q' /tmp/data

输出:

* first foo change
* second foo change  

<强>解释

默认情况下,sed会打印这些行。所以我们只是改变逻辑来删除我们不需要的行。

选择第1行和模式之间的所有内容并将其删除

 1,/Version 1.0.5/d

找到模式时退出

 /Version/Q

答案 3 :(得分:0)

保持更新日志

我在寻找一种从使用 keepachangelog 约定编写的变更日志中提取发行说明的方法时发现了这个线程。

我已经修改了@mklement0 的答案,使其适用于这个约定。

外壳

awk -v ver=1.0.5 '
 /^#+ \[/ { if (p) { exit }; if ($2 == "["ver"]") { p=1; next} } p && NF
' file

脚本

#!/usr/bin/env bash

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