그래서 나는 이것을 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
을 의미하는 정규 표현식으로 해석합니다.grep
o
다른 문자, 그리고 " 로 끝납니다 txt
. 이것은 정규식에서 "모든 문자"를 의미하기 때문에 중요한 세부 사항입니다 .
. 따라서 실제로 원하는 것은 다음과 같습니다.
grep '[a-z][a-z]o\.txt' demo.txt
"Escape \.
"를 .
사용하면 문자 그대로의 점만 일치하고 더 이상 "모든 문자"를 의미하지 않습니다. 그러므로 항상 정규식을 인용하고 조심하세요 .
!
마지막으로 확장 정규식을 사용하여 이 코드를 작성하는 또 다른 방법은 다음과 같습니다.
$ grep -E '[a-z]{2}o\.txt' demo.txt
foo.txt
1참조정규식의 정의는 무엇입니까?glob 및 정규식에 대한 자세한 내용입니다.