pcregrep(또는 pcre2grep)에는 grep의 --max-count 옵션과 동일한 기능이 있습니까?

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없는 것 같습니다 .--max-countgrep

참고: 원하는 결과(등)를 얻기 위한 더 나은 도구가 있다는 것을 알고 있지만 sed여기서는 대체 솔루션을 찾고 있지 않습니다. 내 질문은 pcregrepOR 에 관한 것입니다. 옵션 을 pcre2grep시뮬레이션할 수 있는 방법이 있는지 알고 싶습니다 .grep--max-count

답변1

Debian 9(Stretch)를 사용하고 있으므로 사용 중인 버전에는 10.22가 pcre2-utils포함되어 있습니다 pcre2grep. 이 버전에는 특정 수의 일치 -m후에 종료하는 옵션이 포함되어 있지 않습니다 . --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더 나은 옵션이 있다는 것을 인식하고 그 중 하나를 사용하는 것이 중요합니다.

관련 정보