내가 이해한 바로는 백슬래시 뒤에 문자가 오는 것이 정규식입니다.
하지만 이 명령이 무엇을 하는지 이해가 되지 않습니다.
$ grep '\(.\)\1' < exemple
22
88 9999 88
$ cat exemple
1 1 1 1 1
abc bc fghi
123 45 678
ABC BC FGHI
88 9999 88
점은 모든 문자와 일치해야 하고, 대괄호는 패턴과 일치해야 하며(이것은 확실하지 않음), \1이 무엇을 하는지 이해할 수 없습니다.
답변1
정규식은 \(.\)\1
특정 문자 뒤에 동일한 문자가 오는 모든 줄과 일치합니다. 임의의 단일 문자, .
점 주위의 하위 문자열 \(
과 일치 하고 일치 항목을 "캡처"하며 방금 일치된 문자인 첫 번째 캡처 그룹에 대한 역참조입니다.\)
\1
예제 입력에는 다음 표현식과 일치하는 줄이 있습니다.
88 9999 88
여기서 표현식은 초기 88
하위 문자열 과 일치하므로 grep
행을 표준 출력 스트림으로 출력합니다.
"백슬래시 뒤에 문자가 오는 것은 정규식입니다"라는 진술은 약간 오해의 소지가 있습니다. 전체 표현식은 정규 표현식(이 경우 "확장" 정규 표현식이 아닌 "기본" 정규 표현식)이며 백슬래시는 특정 문자의 의미를 수정합니다. 예를 들어 \[
백슬래시는 다음과 같습니다 .삭제됨특별한 의미를 가지며 [
(그룹 내의 단일 문자와 일치하는 대괄호 표현식을 도입함) 리터럴 왼쪽 대괄호를 강제로 일치시킵니다.
문자열에는 백슬래시가 포함되어 있으므로 정규식이 아닙니다. 정규식으로 해석하는 유틸리티와 함께 사용하기 때문에 정규식입니다. 이와 같은 문자열도 hello
정규식으로 사용할 수 있습니다(따라서 hello
하위 문자열을 포함하는 모든 문자열과 일치합니다).
답변2
\1은 캡처 그룹(괄호로 묶인 부분)에 대한 역참조인 것으로 보입니다. 이는 일치 항목의 특정 부분만 출력하려는 상황에서 유용합니다. 나는 이것을 얼마 전에 사용했습니다 :https://stackoverflow.com/questions/65641590/sed-expression-just-prints-entire-file