Bash
Regex101 到 Grep/egrep 不返回任何內容
我一直在使用以下正則表達式來從降價文件中剪切一些內容,這在 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 ---
我在這裡看到的兩個主要問題是:
- 封閉的
m/
和/
是正則表達式分隔符- 它們不應作為正則表達式本身的一部分包含在內。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