【发布时间】:2019-12-25 11:20:56
【问题描述】:
我想从我的变更日志中提取文本以将其放入变量中。
但我无法告诉 sed/awk 我想要模式的第一次和第二次出现之间的文本。
这是我的更新日志:
This is the changelog of the application
You may find Features and Bug Fixes
# [1.5.0]() (2019-08-20)
### Fixes
- **iOS** Correct some display bugs
# [1.4.0]() (2019-08-15)
### Features
- **Options** New function
...
我希望输出是:
# [1.5.0]() (2019-08-20)
### Fixes
- **iOS** Correct some display bugs
我已经试过了:
sed -n '/# \[/,/# \[/p; /# \[/q' CHANGELOG.md
# [1.5.0]() (2019-08-20)
awk '/# \[/ && ++n == 2, /# \[/' < CHANGELOG.md
# [1.4.0]() (2019-08-15)
我使用'# \[' 作为我的模式。有人可以帮忙吗?
【问题讨论】:
-
awk可能比sed更适合。也就是说,我对过时的sed命令比awk更熟悉,所以我只能建议sed -n '/^# \[/{:l;p;n;/^# \[/q;bl}'(如果当前行是版本行,则循环打印行,直到到达另一个版本行,此时点你退出) -
对不起,但当我尝试这个时,我得到了
sed: 1: "/^# \[/{:l;p;n;/^# \[/q ...": unexpected EOF (pending }'s) -
试试
sed -n '/^# \[/{P;:s n;/^# \[/q;p;bs}' file,它甚至可以使用--posix选项。 -
您使用的是哪个
sed?我用现代 GNU sed 仔细检查了 works fine -
是否必须设置/awk?这是一个使用 Ruby 的解决方案:
ruby -n -W -e 'puts $_ if /^# \[/../^# \[/' <CHANGELOG.md。缺点是有用的..运算符最近已被 Ruby 之神宣布弃用,虽然该命令仍然适用于最新的 Ruby 版本,但它有可能在未来一段时间内停止工作,之后Ruby 的更新。