Grep

pcregrep(或 pcre2grep)是否具有與 grep 的 –max-count 選項等效的功能?

  • October 17, 2021

獲取以下文件:

aaa
bbb
XXX
ccc
ddd
eee
XXX
fff
ggg

我想列印所有行**,pcregrep**直到第一行包含XXX

aaa
bbb
XXX

有可能(使用pcregreppcre2grep)嗎?

我做到了:

$ pcre2grep -nM '(.|\n)*?XXX' file
1:aaa
bbb
XXX
4:ccc
ddd
eee
XXX

有沒有辦法在第一場比賽后退出?似乎pcre2grep沒有像has那樣的--max-count選項。grep

注意:我知道有更好的工具來獲得所需的結果(sed等等),但我不是在這裡尋找替代解決方案。我的問題是關於pcregrepor pcre2grep,我想知道是否有辦法模仿grep--max-count選項。

當您使用 Debian 9 (Stretch) 時,您擁有的版本pcre2-utils包括pcre2grep10.22。該版本不包括在一定數量的比賽后退出的-mor選項。--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是為了做到這一點而設計的,並且沒有選擇以自己可靠的方式獲得此結果。正是出於這個原因,最好使用實際上設計用於實現此目的的工具,例如sedawk之前提到的工具。它們都更可靠且更易於使用來獲得您想要的東西,並且不需要任何修改或不必確切知道在您希望輸出停止的位置之前有多少行。您可能已經打算使用它,pcre2grep但重要的是要認識到有更好的選擇並使用其中之一。

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