다음과 유사한 파일이 있습니다.
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
.
use grep
를 호출하면 -F
패턴이 정규식이 아닌 문자열로 해석됩니다. 이렇게 하면 *
탈출하지 않고도 파일에서 발생 횟수를 셀 수 있습니다 *
(여전히 필요함).인용하다*
쉘이 이를 와일드카드 패턴으로 사용하는 것을 방지하기 위해 ). -F
패턴을 정규식으로 사용하려면 생략하세요.
이 옵션은 이것이 모드임을 -e
나타내는 데 사용됩니다 . 사용하지 않으면 유사한 패턴이 options 로 해석됩니다 .grep
$1
-e
--version
grep
답변2
일부 버전 grep
(예: GNU)에서는 Perl 호환 RE를 제공할 수 있습니다(참조:폴리 메라 제 연쇠 반응), 이는 표준 POSIX 정규식보다 훨씬 더 유연합니다.