我在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或其他方法实现这一目标?
答案 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"