🤷♀️ " 둘다 배워야 되나요? "
" POSIX REGEX 부터 배워야 다른 변종인 REGEX를 접할 때 빨리 학습 할 수 있다! 우선 POSIX ERE를 기준으로 배워두는게 초반에 혼동을 줄일 수 있습니다"
BRE : grep이 작동되는 기본값이다.
ERE : 좀 더 많은 표현식과 편의성을 제공한다. egrep의 기본값이다.
vi 는 BRE를 사용하고 awk 는 ERE를 사용하기 때문에 BRE와 ERE를 서로 변환하는 방법을 알아야 한다.
문자지정
. : 임의의 문자 한개
반복지정
? : 선행문자패턴이 0개 혹은 1개
+ : 선행문자패턴이 1개 이상 반복
* : 선행문자패턴이 0개 이상 반복
{m,n} : interval 반복수를 지정한다
위치지정
^ : 라인의 앞부분
$ : 라인의 끝부분
그룹지정
[...] : 안에 지정된 문자들 그룹 중에 한 문자를 지정한다
[^...] : 안에 지정된 그룹의 문자를 제외한 여집합을 지정한다.
기타
\ : escape, 메타의 의미를 없애준다
| : OR연산을 한다
( ) : 패턴을 그룹화하거나 백레퍼런스 작동을 한다
Quantifier : "?,+,*,{m,n}" 이 4가지 quantifier 앞에 atom문자가 꼭 필요하다. 여기서 "*" 만 BRE이고 나머지는 모두 ERE이다.
:^, $ 패턴의 위치를 지정하는 패턴이다.
$ grep --color "p[abcd]\+ous$" /usr/share/dict/words
해석 : p가 등장하고 그 다음에 [a-d]중에 적어도 한번이상이 나오고, ous가 매칭 끝 부분에 등장하는 경우이다. ($가 지정되면 그 뒤로는 라인의 끝을 의미한다)
$ var2="It's gonna be <b>real</b>It's gonna <i>change everything </i> I feel" $ echo $var2 | egrep -o "<.+>"
"."은 임의의 문자라 "<>"도 들어간다. [^<>] 패턴은 "<>"을 뺀 여집합이기 때문에 이렇게 고쳐야 한다.
PCRE는 lazy quantifier를 제공하여 non-greedy matching을 간단하게 표현할수있다.
$ echo $var2 | grep -P -o "<.+?>"
여기서 <.+?>는 ? 앞에있는 quantifier를 0 or 1개로 제약을 걸어둔것이다. "+?"와 같은 형식을 lazy quantifier라고 한다. 하지만 atom을 .으로 하는 표현은 지양하도록하자
vim에서 만약 Man이 한번이상 등장한걸 찾으려고 "Man+"인 패턴을 입력하면 찾을수가없다. +를 문자열로 인식하기 때문이다. 따라서 "Man+" 와 같이 backslash를 추가한 패턴을 사용해야한다.