코딩 교육이고 xx이고 다 떠나서.. Regex 라도 가르쳤으면.. 짧은 생각, 긴 글

컴퓨터를 만진지는 정말 오랜 시간이 흘렀다. 세기도 싫을 정도.
언어를 알게되고, 그나마 띄엄띄엄(?) 사용할 수 있게 된 건, 한 15년? 물론, 생산 활동에서 사용할 수준은 아닌, 그저 '교양' 수준이다.

그리고, 오늘 글 주제인 Regex 를 사용할 수 있게 된 건 불과 2년 정도.

Regex 역시 자유자재로 구사하는 편은 아니고, 쓸 일 이 있을 때마다 정리해놓은 문서나 책을 보고 사용하는, 그야말로 장님 문고리 잡는 수준이지만, 그래서 그런지 Regex 를 조금 일찍 알았더라면, 하는 아쉬움이 많이 남는다. (그랬다고 해서 내 삶이 크게 달라지지는 않았을 테지만)

요즘, 어린이들에게 코딩 교육을 시켜야 하네 어쩌네하는 말들이 있는데, 그건 다 집어치우고라도 Regex 라도 애들한테 알려줄 수 있다면 좋지 않을까.
Regex 를 모르는 사람과 아는 사람이 해낼 수 있는 일의 차이는 생각보다 크다. 간단히 말하자면, 10여년쯤 전에, 컴퓨터를 능숙히 다루지 못하는 한 친구에게 엑셀에 행수(Line Number)가 포함된 표를 만들라고 했더니, 1,2,3,4.. 이렇게 손으로 넣고 있었다는 서글픈 예를 들어볼 수 있겠다. 그 친구는 스프레드시트에서 제공되는 자동입력기능(숫자 입력후 셀 끌기)를 몰랐던 것이다. 만약 행수가 1000행쯤 됐었더라면?? 오호.. 통재(痛哉)라.

Regex 도 이와 비슷하다. 이런 저런 자잘한 사무업무 중에는, 숫자를 일관되게 바꿔야 한다든가, 파일명을 바꿔야 한다든가 할 일이 가끔은 생기는데, 그게 한 두개라면 그냥 무식하게(아니, 우직(愚直)하게) 밀어붙이면 되겠지만, 그게 10개, 20개, 나아가 수백개, 또는 세기도 어려울 정도가 되면.. 아마 모르긴 해도 저런 단순한 일 때문에 날밤을 샌 '직원'들도 꽤 있으리라. (내가 이런 거 하려고 이 직장에 들어왔느냐며..)

Regex 는 이런 문제를 보다 쉽게, 간편하게, 그리고 강력하게 해결해준다. 게다가, 아마도 논리력 향상에도 꽤 도움이 되지 않을까. (이런 표현은 부모들이 좋아하겠지. 아마도.)
엑셀에서도 Regex 가 지원이 되려나? 엑셀을 써본지가 오래되어 잘은 모르겠으나, 지금 확인해보니 적어도 Libre Calc에선 Regex 를 쓸 수 있다. 파일명 바꾸기를 위해선, Total Commander 의 힘을 빌리면 된다. T.T(TT? Twice?) 자체에서도 강력한 파일명 바꾸기 도구를 제공하지만, 그 안에서 Regex 를 쓰면 그 기능은 더더욱 막강해진다.

글쎄.
대학에서라도 이런 걸 문/이과 구분없이 교양으로 가르쳤으면 좋겠으나.. (아니, 이미 하고 있을 지도 모르지. 애들이 뭘 배우는 지 내가 알 길이 없으니.)

**
혹시라도 이 글을 읽으시는, 아직은 Regex 를 모르시는 분이 계시다면, 한 번쯤 Regex 에 시간을 투자해보시길.
결코 컴쟁이들이나 쓰는 야릇한 도구가 아니라는 걸 알게 되실 겁니다.

Vim: \zs and \ze. 그리고 Lazy(Non-Greedy) 우분투/리눅스

Regex 는 각 프로그램별/언어별로는 대체로 비슷한 문법을 가지지만, 각각 또 독특한 고유의 표기법을 갖는 경우도 있다.

예를 들면, Vim Regex 에서 볼 수 있는 \zs 나 \ze 가 그런 것 중 하나인데, 지금 보는 책(Hacking Vim 7.2)에서 갑자기 이게 튀어나와서 이해하기가 힘들었다. 게다가, 설명을 봐도 뭔 말인지 알아 먹을 수가 있어야지.
\zs : A zero-width match that places the "matching" at the beginning of the line, ignoring any whitespaces
위 책 p25 에 있는 내용인데, 해석조차 되질 않는다. 심지어, 지금은 \zs 가 무슨 역할을 하는지 알고 있음에도 불구하고 뭔 말인지 모르겠다. 내 영어 실력의 한계인가.

Vim help 에는 이렇게 나와있다.
Matches at any position, and sets the start of the match there: The next char is the first char of the whole match.
이 글은 내용을 모르고 봤을 땐 역시나 해석이 안됐었지만, 이젠 이해가 된다.

해석이야 어떻든, \zs 와 \ze 는 이런 거다.
\zs, \ze 는 Look Around 라고 생각하면 된다. 만약 이걸 Look Around 로 구현하려면 다소 복잡한 식을 써야 하는데, \zs, \ze 는 아주 간단하게 할 수 있다.

예를 들어, 아래와 같은 문장에서 fabulous 뒤에 있는 Vim 만을 선택하고 싶다고 하자.
fabulous Vim, various Vim versions, gorgeous Vim
이걸 Look Around 로 하려면, 대충 이렇게 해야 한다.

(?<=fabulous\s)Vim


이건 Positive Lookbehinds 인데, 문법도 다소 복잡하고, 이 기능이 지원되는 환경이 그리 많지 않다는 것도 문제다.(Javascript 에선 안된다.)
그렇다면 Vim 에선? 이렇게 간단하게 할 수 있다.

\vfabulous\s\zsVim


\v 는, 복잡한 Escaping 을 흔히 사용하는 표기로 할 수 있게 해준다. \v 가 없다면 (위에선 같은 결과지만) \를 더 많이 붙여야 해서 식 가독성이 훨씬 떨어지게 된다. 예를 들어, 일반 Regex 에선 { 를 이스케이핑하지 않지만, Vim 에선 \{ 로 해줘야한다. \v 를 쓰면 이럴 필요가 없다.

다음, 매칭하고자 하는 것을 그냥 써 나간다. 찾으려는 것이 fabulous와 공백이므로 그냥 쓴다. "fabuluous\s" 로.
그리고, 최종 매칭하려는 Vim 앞에, \zs 를 붙인다. 이러면, 앞에 찾은 것은 모두 무시되고(앞에 쓴 것들은 '조건'이라고 생각하라), \zs 바로 다음에 나오는 Vim 만 선택이 된다. 이거, 아주 강력한 매칭 도우미라고 할 수도 있겠다.

반대로, \ze 는 이 뒤에 나오는 것들은 선택이 되지 않는다. 즉, '조건'이 \ze 뒤에 나온다고 생각하면 된다.
다음 문장에서, 뒤에 cultures 가 나오는 various 만 선택하고 싶다면,
various moments, various people, and various cultures
이런 표현식이 필요하다.

/various\s\zecultures


\ze 뒤에 나오는 문자열은 선택되지 않고, \ze 바로 왼쪽에서 Matching 이 끝난다.
이걸 이해하고 나서 위에 있는 영어로 된 설명을 보면, 아마도 이해가 될 것이다.




기타..
Vim 에선 Lazy(Non-greedy)를 .* 가 아닌, .{-} 으로 써야 하고, 이스케이핑을 하지 않으려면 앞에 \v 를 써줘야 한다.
이런 식으로.

\v.{-}various


이 정도면 되려나..




우분투 16.04: 커널 4.10.x 설치. 우분투/리눅스

2017년 3월 29일 현재, 우분투 16.04 에서 지원되는 최신 커널은 4.4.0-70 이다.
내가 사용하는데 이 커널이 큰 문제는 없는데, 딱 하나, 좀 번거롭게 만드는 점이 있다.

Nvidia 1050ti 에서 멀티모니터 사용 시, HDMI 모니터 사운드 출력이 한 모니터로만 된다는 문제가 바로 그거다.
그런데, 4.10 으로 바꿨더니 이 문제가 해결되었다. 이것 때문에 17.04를 설치해야 하나하는 생각을 했었지만, 그럴 이유가 사라졌다. 하하하하!
** 확실한 건 아니지만, mesa 드라이버도 최신으로 해야 이 문제가 해결되는 건지도 모른다.
다음 글에서 도움을 받았다.또, 커널 설치에 열광하고 있다면, 다음 글이 더 맘에 들지도.

Vim: Highlight 관련. 우분투/리눅스

몇가지 정리.

" 검색결과 밝게 표시
:set hlsearch


" 입력하는대로 검색
:set is (incremental searches)


/ 를 누르고 원하는 문자열을 입력한 후, 엔터를 누른 후 검색 결과가 나타나는 것이 nois 상태이고, / 이후 누르는 문자에 즉각 반응하여 원하는 문자열을 찾아주는 기능이 is 이다. (뭔 말인지 이해가 되나? 아무튼, 엔터를 누르지 않아도 문자 하나씩 누르는대로 즉각 검색을 하는 것이 is 이다.)

"밝게 표시된 것 해제하기.
:noh (no highlight)

Vim: 문서 전체 복사(클립보드로) 우분투/리눅스

우분투 Vim 에서, 문서 전체를 클립보드로 복사하려면 다음 명령을 내리면 된다.

:%y+


이 명령이 작동하기 위해선 Vim 에 클립보드 기능이 포함되어 있어야 하고, 이를 위해선 vim-gnome이 설치되어야 한다.

아래 글을 참고했다.이 글에선 두가지 방법을 알려주고 있는데, gg 로 이동하는 방법은 안통했다. 이유는 몰라~

위 명령어가 좀 더 간편하고, 직관으로 이해하기에 편하니 저걸 외우도록 하자.
  • % : (무엇을?) 문서 전체를
  • y : (어떻게?)복사하는데
  • + : (어디로?) 클립보드로
+ 와 * 가 MS 윈도우에선 동일하다고 하고, 리눅스에선 약간 다르다고 하는데, 그 내용은 Vim Wiki에 나와있다.

* 는 Selection 을 말하고, + 는 Clipboard 이다.

우분투에서 :y* 로 하면 아무런 변화가 없다. Selection 이란 건 말 그대로 커서를 늘려서(?) 선택한 문자열을 말하는데, y* 라면, Selection 으로 복사를 하라는 뜻이 되어, 아무런 의미가 없다. * 이 의미있게 쓰이려면 이런 식이 되어야 한다.

v 나 V 로 원하는 영역을 선택하고 : 를 누르면 자동으로 선택한 영역을 뜻하는 '<,'> 가 나오는데, 이것 대신 * 을 써도 같은 결과가 된다. 즉, :*y 를 해도 된다는 건데.. 굳이 이럴 필요가 있나? ^^

또는, :*y+ 라고 명령을 내리면, Selection 을 복사하여 클립보드로 보내라는 명령이 되겠다.

1 2 3 4 5 6 7 8 9 10 다음

Google Analyze


LastFm

MathJax