Grep을 탐욕스럽지 않게 만드는 방법

Grep을 탐욕스럽지 않게 만드는 방법

다음과 같은 파일을 받았습니다.

helsoidfiejoih
heye heye hey 
me is hi

파일에는 여러 줄이나 문자가 포함될 수 있습니다. 요점은 이것이 일종의 텍스트 파일이라는 것입니다. 이제 grep에 전달된 첫 번째 매개변수가 파일 이름이고 두 번째 매개변수가 패턴이 되도록 몇 가지 작업을 수행하려면 grep을 사용해야 합니다. 하지만 grep은 탐욕스러운 일치를 수행하므로 내가 원하는 비탐욕적 일치(탐욕적이지 않은 일치) 대신 전체 줄과 일치합니다. 이제 나는 다음을 시도했습니다.

grep -Ec -Po "$2" $1

그것은 나에게 상반된 표현을 준다. 그리고 사용자는 AKA RE 패턴을 입력할 수 있으므로 -E는 필수 옵션입니다. grep을 탐욕스럽지 않게 만드는 방법이 있습니까? -P 옵션을 사용하면 grep 명령이 비 욕심적이라고 들었지만 시도해 본 후에는 다음과 같습니다.

grep -c -Po "$2" $1

grep 표현을 탐욕스럽지 않게 만드는 것 같지 않습니까 ??

편집: 사람들은 제가 작업하는 패턴을 표시하지 않는다고 말했습니다. 따라서 패턴을 명확히 하기 위해 RE가 될 것입니다. 예를 들어 사용자가

./thisfile.sh h file1.txt

file1.txt에 h가 나타나는 횟수를 찾습니다.

./thisfile.sh io file1.txt

file1.txt에 io가 나타나는 횟수를 찾습니다. 이를 수행할 수 있는 방법이 있습니까?

답변1

파일에서 하위 문자열이 나타나는 횟수를 계산하려면 다음을 수행하십시오.

#!/bin/sh

grep -F -o -e "$1" | wc -l

이 스크립트를 다음과 같이 사용합니다.

$ ./script e <script
       2
$ ./script ' -' <script
       4
$ ./script hey <file1
       3
$ ./script he <file1
       4
$ df | ./script %
       7

여기서는 스크립트 자체의 문자 수를 세고 e공백과 대시로 구성된 하위 문자열이 스크립트에 나타나는 횟수를 계산합니다. 그런 다음 질문에 제시된 파일에서 두 개의 하위 문자열을 계산합니다. 마지막 예는 df내 시스템 의 출력에서 ​​퍼센트 기호 수를 계산합니다 .

입력 데이터는 표준 입력을 통해 읽혀지며 스크립트의 유일한 인수는 우리가 찾고 계산하려는 하위 문자열입니다.

스크립트는 단일 grep+ wc파이프라인으로 구성됩니다. 비표준(그러나 일반적으로 구현되는) -o옵션을 사용하여 겹치지 않는 일치 항목 목록을 별도의 줄에 반환합니다. 그런 다음 이 줄은 로 계산됩니다 wc -l.

패턴을 정규식이 아닌 문자열로 해석하기 위해 grep사용되는 호출입니다 . 이를 통해 예를 들어 파일에서 발생하는 -F횟수를 계산할 수 있습니다 .**인용하다*쉘이 이를 글로빙 패턴으로 사용하는 것을 막기 위한 것입니다) . -F패턴을 정규식으로 사용하려면 생략하세요 .

옵션은 그것이 패턴임을 -e알려주는 데 사용됩니다 . 를 사용하지 않으면 와 같은 패턴이 에 대한 옵션으로 해석됩니다 .grep$1-e--versiongrep

답변2

일부 버전 grep(예: GNU)에서는 Perl 호환 RE를 제공할 수 있습니다.PCRE), 이는 표준 POSIX 정규식보다 훨씬 더 유연합니다.

관련 정보