2016-11-06 56 views
1

我在降价有一个更新日志文件,其中包含我的应用程序的每个版本一样,之间的所有变化中提取的变化:解析更新日志和版本

## 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这将那些2个PARAMS:

version:该版本提取改变

filename:文件名解析

我如何使用sed,awk中,grep的,或任何实现这一目标?

+0

的可能的复制[如何选择两种模式之间的线路?](http://stackoverflow.com/questions/38972736/how-to-select-lines-between-two-patterns) – Sundeep

+0

另请参阅https://stackoverflow.com/documentation/awk/1403/variables#t=201611061418048683413和(https://stackoverflow.com/questions/2227583/passing-variable-to-awk-and-using-that-in-a-regular-expression – Sundeep

回答

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" 
+0

为什么在'$ 3 == ver'时添加'if'可以正常工作。为什么混乱代码?如果... –

+0

对不起...我不知道如果代码没有,如果将工作...没有意识到,它是在一个支撑... –

+1

我喜欢使用'NF'跳过空行.. + 1 –

1

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

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 
+0

有趣,但为了避免误报,你应该(a)逃避' 。'在版本号中用'\ .'表示(这意味着用一个变量的输入,你必须首先执行这个替换_programmatically_)和(b)确保版本号只在最后一个字边界上匹配太。另外,为了确保在_first_行上也可以找到潜在的匹配项,范围应该以'0'开始('0,/ Version 1 \ .0 \ .5 \ b /')。使用'0'开始范围并使用'Q'函数是_GNU_'sed'扩展,所以在BSD/macOS上需要更复杂的解决方案。 – mklement0

+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 

$ 
+0

'$ 3 == v'不是'$ 3 == version' –

+0

如果意图是跳过版本的行,那么下一个命令可以在'{}'里面使用。这就是问题所要求的。 –

+0

我知道我与请求相矛盾,但我认为在输出中包含标题是有帮助的(并且它使代码更简单)。 – chepner