【问题标题】:How to use same pattern with multiples occurrences?如何使用多次出现的相同模式?
【发布时间】: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 /^# \[/../^# \[/' &lt;CHANGELOG.md 。缺点是有用的 .. 运算符最近已被 Ruby 之神宣布弃用,虽然该命令仍然适用于最新的 Ruby 版本,但它有可能在未来一段时间内停止工作,之后Ruby 的更新。

标签: bash awk sed


【解决方案1】:

您可以使用以下 GNU sed 命令:

sed -n '/^# \[/{:l;p;n;/^# \[/q;bl}'

解释:

  • -n : 默认不打印行
  • /^# \[/{...}:遇到版本行时,执行{...}里面的命令
  • :l:标签 l,表示循环的开始
  • p;n : 打印当前行,开始下一行
  • /^# \[/q 如果下一行是版本行,则让 sed 退出
  • bl :(否则)跳转到标签 l,循环直到遇到版本行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2010-12-10
    • 1970-01-01
    相关资源
    最近更新 更多