pcregrep(或 pcre2grep)是否具有與 grep 的 –max-count 選項等效的功能?
獲取以下文件:
aaa bbb XXX ccc ddd eee XXX fff ggg
我想列印所有行**,
pcregrep
**直到第一行包含XXX
:aaa bbb XXX
有可能(使用
pcregrep
或pcre2grep
)嗎?我做到了:
$ pcre2grep -nM '(.|\n)*?XXX' file 1:aaa bbb XXX 4:ccc ddd eee XXX
有沒有辦法在第一場比賽后退出?似乎
pcre2grep
沒有像has那樣的--max-count
選項。grep
注意:我知道有更好的工具來獲得所需的結果(
sed
等等),但我不是在這裡尋找替代解決方案。我的問題是關於pcregrep
orpcre2grep
,我想知道是否有辦法模仿grep
的--max-count
選項。
當您使用 Debian 9 (Stretch) 時,您擁有的版本
pcre2-utils
包括pcre2grep
10.22。該版本不包括在一定數量的比賽后退出的-m
or選項。--max-count
話雖如此,您正在嘗試做的事情,列印到一個字元串,對於您擁有的版本根本不可能。Debian 11 (Bullseye) 附帶的版本 10.34 確實有這個選項。您可以在必須通過以下方式實現預期輸出的文件上使用它:
pcre2grep -B2 -m1 XXX file
您也可以使用正則來執行此操作,
grep
因為您的情況不需要使用 Perl 兼容的正則表達式:grep -B2 -m1 XXX file
不需要該
-n
選項,因為它只是列印不在預期輸出中的行號,並且該-M
選項與該選項衝突,-m
因為前者告訴它匹配多行。上述命令的輸出:
aaa bbb XXX
這會列印到字元串的第一個匹配項
XXX
以及它之前的兩行;但是,我不建議這樣做,因為您必須確切知道從行首到字元串出現了多少行。對於您的特定文件,這可能不是問題,但如果文件包含數千或數百萬行,則可能是問題。實際上,您嘗試做的是列印從文件開頭到並包括某個字元串的所有內容。
grep
兩者或其任何衍生產品都不pcre2grep
是為了做到這一點而設計的,並且沒有選擇以自己可靠的方式獲得此結果。正是出於這個原因,最好使用實際上設計用於實現此目的的工具,例如sed
我awk
之前提到的工具。它們都更可靠且更易於使用來獲得您想要的東西,並且不需要任何修改或不必確切知道在您希望輸出停止的位置之前有多少行。您可能已經打算使用它,pcre2grep
但重要的是要認識到有更好的選擇並使用其中之一。