Command-Line
在 CLI 中使用正則表達式的 Grep 不返回任何內容
我有以下文件。
//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 運算符,您可以使用
pcregrep
which 具有多行模式,-M
並且可以被告知報告部分匹配項:pcregrep -xMo1 '(?s)\[runscript\]\n(.*?)\n\[/runscript]'
或者:
pcregrep -xMo1 '(?s)\[runscript\]\r?\n(.*?)\n\[/runscript]\r?'
允許 MS-DOS 樣式的 CRLF 行分隔符(如果輸入中存在 CR,則此處包含在輸出中)。