Bash

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

  • December 19, 2019

我一直在使用以下正則表達式來從降價文件中剪切一些內容,這在 regex101 中效果很好,但似乎無法讓 grep 使用它。

要麼出錯,要麼不返回任何東西

正則表達式在這裡:https ://regex101.com/r/XDImM9/1 或(?s)##\s\[v0.0.1].+?(?=---)

我嘗試使用帶有 -P 標誌的 grep ,它應該支持 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. 封閉的m//是正則表達式分隔符- 它們不應作為正則表達式本身的一部分包含在內。
  2. grep預設情況下是面向行的,所以並沒有真正進行多行匹配。至少在 GNU grep 中,您可以使用空字節定界來通過添加-Z標誌來組合它。

所以例如

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

### Added
- Initial Commit/Release

對於多行匹配,您可以考慮使用pcregrep它是否可用於您的平台 ex。

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

你必須刪除m//分隔符,所以:

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

但是grep預設情況下 不適合處於多行模式,就像在您的 regex101 程式碼段中一樣。

所以,perl來救援:

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

輸出

## [v0.0.1]

### Added
- Initial Commit/Release

引用自:https://unix.stackexchange.com/questions/557981