Regex101 到 Grep/egrep 不返回任何内容

Regex101 到 Grep/egrep 不返回任何内容

我一直在使用以下正则表达式从 markdown 文件中剪切一些内容,这在 regex101 中效果很好,但似乎无法让 grep 来使用它。

要么出错,要么不返回任何内容

正则表达式在这里:https://regex101.com/r/XDImM9/1 或者(?s)##\s\[v0.0.1].+?(?=---)

我尝试过使用 grep 和 -P 标志,它应该支持 PCRE 风格的正则表达式,但似乎没有做太多事情 grep -P 'm/(?s)##\s\[v0.0.1].+?(?=---)/' CHANAGELOG.md

我一直在处理的样本数据是

# Changelog

All notable changes to this project will be documented in this file.
Please note that all entries must end with `---` to allow for the auto release body to  use the Changelog



## [v0.0.1]

### Added
- Initial Commit/Release
---

答案1

我在这里看到的两个主要问题是:

  1. 封闭的m/and/是正则表达式分隔符– 它们不应作为正则表达式本身的一部分包含在内。

  2. grep默认情况下是面向行的,因此它并没有真正进行多行匹配。至少在 GNU grep 中,您可以通过添加标志来使用空字节定界来拼凑它-z

例如,

$ grep -zPo '(?s)##\s\[v0.0.1].+?(?=---)' CHANGELOG.md
## [v0.0.1]

### Added
- Initial Commit/Release

对于多行匹配,pcregrep如果它适用于您的平台,您可以考虑使用,即

pcregrep -Mo '(?s)##\s\[v0.0.1].+?(?=---)' CHANGELOG.md

答案2

您必须删除m//分隔符,因此:

grep -P '(?s)##\s\[v0.0.1].+?(?=---)' CHANAGELOG.md

不适合在多线模式默认情况下,就像您的 regex101 代码片段中一样。

所以,救援:

perl -0 -lne 'print $& if m/(?s)##\s\[v0.0.1].+?(?=---)/' file

输出

## [v0.0.1]

### Added
- Initial Commit/Release

相关内容