Command-Line

在 CLI 中使用正則表達式的 Grep 不返回任何內容

  • August 26, 2022

我有以下文件。

//TESTCASES=3
//MARK=9

[runscript]
nc dec s10 s11
[/runscript]

[checks]

[/checks]

[testcase]
// List: 1, 2, 3, 5, 0xA, -1
.global LIST
.data
LIST: 
.word 1, 2, 3, 5, 0xA, -1
[/testcase]

我正在嘗試獲取[runscript][/runscript]使用 grep 和 regex 之間的文本。

我已經驗證了正則表達式可以獨立工作。

(?<=\[runscript\]\n)(.|\n)*(?=\[\/runscript\])

但是,grep 什麼也不返回。是選項的問題嗎?我已經單獨嘗試了很多,也嘗試過組合。

-P,-e,-E,-w,-o

我錯過了什麼?

我不會使用grep,而是awk

awk '
   $0=="[runscript]" {rs++; next}
   $0=="[/runscript]" {rs--}
   rs {print}
' file

輸出

nc dec s10 s11

如果您真的想使用grep,這將適用於 PCRE 和 NUL 分隔的數據。但我會建議人們更難理解(和維護)awk版本,並且更不便攜:

grep -zoP '(?<=\[runscript\]\n)(.|\n)*?(?=\[\/runscript\])' file

輸出(帶有不可見的尾隨 NUL)

nc dec s10 s11

如果有任何比賽,我已經調整了你的 RE 以應對多場比賽。

grep一次只在一行上工作,所以正則表達式匹配的東西永遠不會包含換行符。

由於您想使用 perl/PCRE 運算符,您可以使用pcregrepwhich 具有多行模式,-M並且可以被告知報告部分匹配項:

pcregrep -xMo1 '(?s)\[runscript\]\n(.*?)\n\[/runscript]'

或者:

pcregrep -xMo1 '(?s)\[runscript\]\r?\n(.*?)\n\[/runscript]\r?'

允許 MS-DOS 樣式的 CRLF 行分隔符(如果輸入中存在 CR,則此處包含在輸出中)。

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