programing

grep에서 별표 사용

bestprogram 2023. 4. 27. 22:53

grep에서 별표 사용

Linux/bash의 특정 파일에서 하위 문자열 "abc"를 검색하려고 합니다.

그래서 나는:

grep '*abc*' myFile

아무것도 반환되지 않습니다.

하지만 내가 한다면,

grep 'abc' myFile

일치하는 항목을 올바르게 반환합니다.

자, 이것은 저에게 문제가 되지 않습니다.하지만 만약 내가 더 복잡한 문자열을 찾고 싶다면, 이렇게 말합니다.

*abc * def *

grep을 사용하여 어떻게 수행해야 합니까?

별표는 반복 연산자에 불과하지만 반복되는 내용을 알려주어야 합니다. /*abc*/는 b와 0 또는 그 이상의 c를 포함하는 문자열과 일치합니다(두 번째 *는 c에 있기 때문에, 첫 번째 *는 반복할 대상이 없으므로 의미가 없습니다).매치하고 싶은 것이 있다면 다음과 같이 말해야 합니다..*점은 (특정 지침 의) 모든 문자를 의미합니다.abc와 매치하고 싶다면, 그냥 말하면 됩니다.grep 'abc' myFile좀 더 복잡한 일치를 위해서는.*--grep 'abc.*def' myFileabc 뒤에 def가 있는 문자열과 선택적으로 중간에 있는 문자열을 일치시킵니다.

설명을 기반으로 업데이트:

*정규식의 경우 콘솔의 *와 정확히 동일하지 않습니다.콘솔에서 *는 글로벌 구성의 일부이며 와일드카드 역할만 합니다(예:ls *.log.log)로 끝나는 모든 파일이 나열됩니다.그러나 정규식에서 *는 수식어입니다. 즉, 수식어는 앞에 있는 문자나 그룹에만 적용됩니다.정규식에서 *을(를) 와일드카드로 사용하려면.*앞에서 언급한 대로 - 점은 와일드카드 문자이며, 점을 수정할 때 별표는 하나 이상의 점을 찾는 것, 즉 하나 이상의 문자를 찾는 것을 의미합니다.

점 문자는 어떤 문자와도 일치한다는 의미이므로,.*0개 이상의 문자가 발생하는 것을 의미합니다.당신은 아마도 사용할 것입니다..*뿐만 아니라*.

grep -P 사용 - Perl 스타일 정규식을 지원합니다.

grep -P "abc.*def" myfile

"별의 별자리"는 그 앞에 무언가가 있을 때만 의미가 있습니다.도구가 없는 경우(이 경우 grep) 오류로 처리할 수 있습니다.예:

'*xyz'    is meaningless
'a*xyz'   means zero or more occurrences of 'a' followed by xyz

이것은 저에게 효과가 있었습니다.

grep "*.*${expr}" - 점 앞에 이중 기호가 있습니다.여기서 ${expr}은 줄 끝에 필요한 문자열입니다.

그래서 당신의 경우:

grep ".*abc.*" myFile

표준 유닉스 grep.

예를 들어 Linux의 셸 명령줄에서 작동하는 식과 같이 시도한 표현을 "glob"이라고 합니다.Glob 표현식은 전체 정규식이 아니며, 이는 grep이 검색할 문자열을 지정하는 데 사용하는 것입니다.여기 차이점에 대한 (오래된, 작은) 게시물이 있습니다.글로벌 표현식("ls *"에서처럼)은 셸 자체에 의해 해석됩니다.

글러브에서 RE로 번역하는 것은 가능하지만, 일반적으로 당신은 머리 속에서 그렇게 해야 합니다.

당신은 정규 표현을 사용하지 않기 때문에 당신의 그렙 변형 선택은 다음과 같아야 합니다.fgrep당신이 기대하는 대로 행동할 것입니다.

확장 정규식 지원을 위해 grep -E 시도

또한 다음을 살펴보십시오.

그렙맨 페이지

이전 항목에 대한 수식어로 작동합니다.따라서 'abc*def'는 'ab'을 검색한 후 0 또는 그 이상의 'c' 뒤에 'def'를 검색합니다.

당신이 원하는 것은 아마도 'abc'일 것입니다.*def'는 'def' 뒤에 오는 임의의 수의 문자와 'def'를 검색합니다.

이것이 당신이 찾고 있는 답일 수도 있습니다.

grep abc MyFile | grep def

단 한가지는...출력 라인이 "def"가 "abc"보다 앞에 있거나 "abc" 뒤에 있을 경우

저는 다른 답변을 요약하고 정규식과 글로벌이 어떻게 작동하는지 이해하기 위해 이러한 예를 만듭니다.

3개의 파일이 있습니다.

echo 'abc' > file1
echo '*abc' > file2
echo '*abcc' > file3

이제 이 세 개의 파일에 대해 동일한 명령을 실행합니다. 어떻게 되는지 보겠습니다.

(1)

grep '*abc*' file1 

당신이 말했듯이, 이것은 아무것도 돌려주지 않습니다. *그 앞에서 무언가를 반복하고 싶어합니다. 번째 음으로처를 .*앞에 반복할 것이 없으므로 시스템은 이를 인식합니다.**왜냐하면 파일의 문자열은abc, 기에는 없다거.*찾을 수 없는 문자열입니다. 번째 두번째째.*뒤에 c는 그것이 반복됨을 의미합니다.c0회 이상.

(2)

grep '*abc*' file2

이것은 리턴입니다.*abc 가있때문이 입니다.*앞에 패턴과 잘 어울립니다.*abc*.

(3)

grep '*abc*' file3

이것은 리턴입니다.*abcc 가있때문이 입니다.* 2인치 2인치.c하도록 맨뒤에패일치니다합과턴서그래▁so▁it▁the▁pattern뒤다맨에니.*abc*

(4)

grep '.*abc.*' file1

이것은 리턴입니다.abc.*문자의 반복이 0 이상임을 나타냅니다.

$ cat a.txt
123abcd456def798
123456def789
Abc456def798
123aaABc456DEF

*이전 문자와 0회 이상 일치합니다.

$ grep -i "abc*def" a.txt


$

예를 들어 "abdef", "abcdef" 또는 "abcccccccdef"와 일치합니다.하지만 파일에 이것들이 하나도 없어서 일치하지 않습니다.

."모든 문자 일치"를 의미합니다. 함께 사용*,.*임의의 문자와 일치하는 횟수를 의미합니다.

$ grep -i "abc.*def" a.txt
123abcd456def798
Abc456def798
123aaABc456DEF

그래서 우리는 성냥을 얻습니다.정규 표현식에 대한 온라인 참조가 많이 있는데, 이것이 여기서 사용되고 있는 것입니다.

언급URL : https://stackoverflow.com/questions/1069302/using-the-star-sign-in-grep