Grep/egrep の Regex101 は何も返しません。

Grep/egrep の Regex101 は何も返しません。

私はマークダウンファイルからいくつかのコンテンツを切り取るために次の正規表現を使用してきました。これはregex101でうまく機能しますが、grepではそれを使用できないようです。

エラーが発生したり、何も返されません。

正規表現は次のとおりです。https://regex101.com/r/XDImM9/1 または(?s)##\s\[v0.0.1].+?(?=---)

PCREスタイルの正規表現をサポートする必要があるgrepおよび-Pフラグを試してみましたが、あまり効果がないようです。 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

ここで見られる2つの主な問題は次のとおりです。

  1. 閉じm//正規表現です。区切り記号- 正規表現自体の一部として含めないでください。

  2. grepデフォルトは行指向であるため、実際には複数行の一致を実行しません。少なくともGNU grepでは、ヌルバイト区切りを使用するフラグを追加することでこれを1つにまとめることができます-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

関連情報