다음 파일을 가져옵니다.
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-count
grep
참고: 원하는 결과(등)를 얻기 위한 더 나은 도구가 있다는 것을 알고 있지만 sed
여기서는 대체 솔루션을 찾고 있지 않습니다. 내 질문은 pcregrep
OR 에 관한 것입니다. 옵션 을 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
더 나은 옵션이 있다는 것을 인식하고 그 중 하나를 사용하는 것이 중요합니다.