grep: 대괄호를 사용하여 특정 문자 일치

grep: 대괄호를 사용하여 특정 문자 일치

그래서 나는 이것을 grep의 힘을 시험해보기 위해 사용하고 있습니다.자원

현재 내가 겪고 있는 문제는 예상대로 작동하지 않는 것 같다는 것입니다. 그래서 다음을 포함하는 데모.txt 파일이 있습니다.foo.txt, 이 코드를 사용하여 검색했지만 grep [a-z][a-z]o.txt demo.txt비어 있는 결과가 반환되었습니다. zsh: no matches found: [a-z][a-z]o.txt 대괄호 사용법에 대한 나의 이해가 잘못된 것인지 알고 싶습니다.

사진은 다음과 같습니다.

여기에 이미지 설명을 입력하세요.

답변1

에 전달한 정규식을 인용하지 않았기 때문에 grep쉘에 의해 포착되고 쉘은 이를 확장하려고 시도합니다.앞으로전화하세요 grep. 이제 사용한 정규식은 유효한 쉘 글로브 모드 1 이기도 합니다 . 이는 "현재 폴더에서 이름이 두 문자 뒤에 문자열이 오는 모든 파일 또는 디렉터리를 나열합니다 o.txt"를 의미합니다. 현재 디렉터리에 glob과 일치하는 파일이나 하위 디렉터리가 포함되어 있는 경우 glob은 일치하는 파일 이름으로 확장됩니다.

$ ls
abo.txt  demo.txt

$ cat demo.txt
foo.txt

$ set -x
$ grep [a-z][a-z]o.txt demo.txt 
+zsh:7> grep abo.txt demo.txt

실행한 실제 명령을 보여주십시오 set -x. zsh보시다시피 [a-z][a-z]o.txt일치하는 파일 이름으로 확장됩니다: abo.txt, 및저것에 전달된 내용입니다 grep.

이제 실제로 디렉터리에 일치하는 파일 이름이 없습니다. 이는 zsh패턴이 빈 문자열로 확장되거나 grep전혀 시작되지 않음을 의미합니다. 이것이 오류의 원인입니다 zsh: no matches found: [a-z][a-z]o.txt. 이는 glob을 일치하는 파일로 확장할 수 없다는 것을 zsh가 알려주는 것입니다.

마지막으로 스키마를 올바르게 참조하면 다음과 같은 결과가 발생합니다.

$ grep '[a-z][a-z]o.txt' demo.txt 
+zsh:12> grep '[a-z][a-z]o.txt' demo.txt
foo.txt

이번에는 따옴표가 패턴을 전달하는 쉘로부터 패턴을 보호합니다.있는 그대로그리고 이를 "두 개의 소문자, then , then " grep을 의미하는 정규 표현식으로 해석합니다.grepo다른 문자, 그리고 " 로 끝납니다 txt. 이것은 정규식에서 "모든 문자"를 의미하기 때문에 중요한 세부 사항입니다 .. 따라서 실제로 원하는 것은 다음과 같습니다.

grep '[a-z][a-z]o\.txt' demo.txt 

"Escape \."를 .사용하면 문자 그대로의 점만 일치하고 더 이상 "모든 문자"를 의미하지 않습니다. 그러므로 항상 정규식을 인용하고 조심하세요 .!

마지막으로 확장 정규식을 사용하여 이 코드를 작성하는 또 다른 방법은 다음과 같습니다.

$ grep -E '[a-z]{2}o\.txt' demo.txt      
foo.txt

1참조정규식의 정의는 무엇입니까?glob 및 정규식에 대한 자세한 내용입니다.

관련 정보