a(i)%b(j)%c 형식의 변수가 포함된 파일이 있습니다. 여기서 a, b 및 c는 항상 동일하지만 인덱스 i와 j는 다를 수 있습니다(여러 문자 포함). 그래서 grep을 사용하여 이러한 변수의 인스턴스를 찾으려고 노력하고 있지만 성공 여부는 검색 문자열 주위에 따옴표를 포함하는지 여부에 따라 달라지며 차이가 있는 이유를 이해하려고 노력하고 있습니다. 단일 문자 인덱스에서 검색을 시작하는 경우:
(1) grep a\(.\)\%b\(.\)\%c file
예상대로 작동합니다
(2) grep 'a\(.\)\%b\(.\)\%c' file
일치하지 않음
(3) grep "a\(.\)\%b\(.\)\%c" file
일치하지 않음
그런 다음 (더 혼란스럽게 만들기 위해!) 다중 문자 인덱싱 가능성을 포함해 보았습니다.
(4) grep a\(.*\)\%b\(.*\)\%c file
작동하지 않습니다. - zsh: 일치하는 항목을 찾을 수 없습니다: a(.)%비(.)%씨
(5) grep 'a\(.*\)\%b\(.*\)\%c' file
작품
(6) grep "a\(.*\)\%b\(.*\)\%c" file
작품
각 경우에 무슨 일이 일어나고 있는지 설명해 줄 수 있는 사람이 있나요? (4)의 경우 별표로 인해 쉘(zsh)이 다른 작업을 수행하는 것처럼 보이지만 실제로는 무엇을 하는지 잘 모르겠습니다. 특히 (1), (5), (6)은 작동하지만 (2)와 (3)은 작동하지 않는 이유가 무엇인지 혼란스럽습니다.
감사해요!
답변1
쉘 이스케이프와 이스케이프를 구별해야 합니다 grep
.
기본 정규 표현식(BRE; grep
옵션 없이 사용되는 경우 사용 -E
) 및 를 (
일반 문자로 처리합니다. 시퀀스 는 특별한 의미를 갖습니다.)
|
\(
\|
따옴표가 없으면 쉘은 백슬래시를 이스케이프 문자로 처리하여 제거합니다. 즉, grep
표시되지 않습니다. 따옴표를 사용하면 백슬래시가 표시되므로 grep
및의 의미가 변경됩니다.(
|
확장 정규식( grep -E
)의 경우 그 반대가 적용됩니다. (
및 |
는 특별하므로 일반 문자로 처리하려면 앞에 bashslash를 붙여야 합니다.