다음과 같은 파일을 받았습니다.
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
--version
grep
답변2
일부 버전 grep
(예: GNU)에서는 Perl 호환 RE를 제공할 수 있습니다.PCRE), 이는 표준 POSIX 정규식보다 훨씬 더 유연합니다.