특정 패턴을 조건으로 문자열 바꾸기

 

앞서 vim의 문자열 바꾸기는 특정 패턴의 문자열을 원하는 문자열로 바꾸는 방법에 대해서 간단히 알아보았다.

 

 

그런데 문자열을 바꿀 때, 단순히 문자열 패턴을 찾아서 바꾸는 것만으로 부족한 경우가 있다

 

가령 아래와 같이 이름과 거주지 그리고 그 사람의 집 전화번호를 데이터로 기록했는데 이 전화번호에 지역 번호가 빠져 있어 지역별로 지역번호를 부여해야하는 경우다. 

 

이름    거주지    전화번호

철수     서울     888-8888

영희     광주     888-8888

재범     서울     777-7777

선영     부산     888-8888

호동     서울     666-6666

 

우리가 하고 싶은 것은 전화번호 앞에 지역번호를 붙이는 것이다. 그런데 이 지역번호는 살고 있는 거주지에 따라서 달라진다. 가령, 서울의 지역번호는 02이므로 서울에 사는 철수, 재범, 호동은 전화번호 앞에 02- 라는 문자열이 첨가되어야 한다. 이와 같은 경우는 우리가 찾고자 하는 문자열 패턴과 우리가 바꾸고자 하는 문자열 패턴이 다르기 때문에 문제가 된다.

 

이렇게 찾는 문자열 패턴바꿀 문자열 패턴다른 경우 찾는 문자열 패턴을 조건으로 바꿀 문자열바뀐 문자열로 바꾸면 된다. 

 

이는 다음과 같은 형식으로 명령 라인에 명령어를 입력하면 된다

 

:g/[찾을 문자열]/s/[바꿀 문자열]/[바뀐 문자열]/[바꾸기 옵션]

 

이를 해석하면 문서 전체에서 [찾을 문자열]이 있는 행을 모두 찾아서 그 행에 [바꿀 문자열]이 있으면 이를 [바꾸기 옵션]에 따라서 [바뀐 문자열]로 바꾼다로 해석한다. 

 

[바꿀 문자열], [바뀐 문자열], [바꾸기 옵션]앞서 포스팅한 내용대로 하면 적용된다. [찾을 문자열]도 [바꿀 문자열]과 마찬가지이다. 명령의 가장 맨 앞에 g는 항상 입력하도록 하자. g를 생략할 경우도 작동하지만 별로 쓸모가 있는 것 같지는 않다.

 

위의 명령에서 [바꿀 문자열]을 생략하면 [찾을 문자열]이 [바꿀 문자열]의 역할을 한다.

 

:g/[찾을 문자열]/s//[바뀐 문자열]/[바꾸기 옵션]

= :%s/[찾을 문자열]/[바뀐 문자열]/[바꾸기 옵션]

즉, 모두 문서 전체에서 [찾을 문자열]을 찾아 [바꾸기 옵션]에 따라서 [바뀐 문자열]로 바꾸라는 명령이다. 

 

이제까지 설명한 방식에 따라서 위의 서울에 거주하는 사람들의 전화번호 앞에 지역번호를 추가하는 명령어는 다음과 같다.

 

:g/서울/s/\(\d\+-\d\+\)/02-\1/g

문서 전체에서 '서울' 이라는 문자열이 있는 행에서만 숫자의 연속 하이픈(-) 숫자의 연속 형태의 문자열을 그 앞에 '02-' 라는 문자열을 붙인 형태로 다음과 같이 바꾼다

 

이름    거주지    전화번호

철수     서울     02-888-8888

영희     광주     888-8888

재범     서울     02-777-7777

선영     부산     888-8888

호동     서울     02-666-6666

 

만일, 다음과 같이 명령어를 입력한 경우라면 내용이 조금 달라진다.

 

:g/\(\d\+-\d\+\)/s//02-\1/g

이것은 :%s/\(\d\+-\d\+\)/02-\1/g 와 동일하므로 [찾을 문자열]이 숫자의 연속 하이픈(-) 숫자의 연속 형태의 문자열이고 동시에 [바꿀 문자열]이 되므로 다음처럼 모든 전화번호 앞에 '02-' 라는 문자열이 첨가된 형태로 바뀐다.

 

이름    거주지    전화번호

철수    서울    02-888-8888

영희    광주    02-888-8888

재범    서울    02-777-7777

선영    부산    02-888-8888

호동    서울    02-666-6666

 

Anki 파일

 

아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 

 

 

 

045 vim 특정 패턴을 조건으로 문자열 바꾸기.apkg
다운로드

 

vim 바꾸기에서 슬래쉬(/) 사용


바꾸기를 할 때 [바꿀 문자열] 이나 [바뀐 문자열]슬래쉬(/)가 포함되면 어떻게 해야할까? 가령, 다음과 같은 파일의 경로를 바꾸기 하는 경우를 생각해보자. 

 

/home/ubuntu/document  →  /root/document


이를 기본 형식 그대로 :[범위]s/[바꿀 문자열]/[바뀐 문자열]/[바꾸기 옵션] 으로 다음과 같이 명령하면 구분자슬래쉬(/)가 너무 많아 오류가 발생할 것이다


:%s//home/ubuntu/document//root/document/g


이런 경우 해결 방법은 두 가지다. 하나는 구분자를 슬래쉬(/) 대신 (.)으로 쓰는 것이고 다른 하나는 슬래쉬(/)가 구분자로 쓰이지 않도록 앞에 역슬래쉬(\)를 붙여 escape 하는 것이다. 즉 다음과 같다.

 

:%s./home/ubuntu/document./root/document.g 슬래쉬(/) 대신 (.)을 구분자로 사용

:%s/\/home\/ubuntu\/document/\/root\/document/g 슬래쉬(/) 앞에 역슬래쉬(\)를 붙이기



vim 바꾸기에서 정규 표현식 이용하기


정규 표현식에 대해서는 앞서 포스팅한 내용을 참조하기 바란다. 


정규 표현식을 이용하면 바꾸기 기능을 훨씬 더 강력하게 사용할 수 있다


가령, 아래의 모든 행의 맨 앞에 http:// 문자열을 첨가하고 싶다


www.daum.net

www.naver.com

www.google.com


정규표현식을 이용하면 간단하게 만들 수 있다


:%s.^.http://.g

캐럿(^)행의 시작을 의미하므로 모든 행이 시작되는 곳에 http:// 문자열이 첨가된다

 

http://www.daum.net

http://www.naver.com

http://www.google.com


아래에는 휴대폰 번호와 이메일이다. 휴대폰 번호 앞에 편의상 010- 문자열을 뺐는데 이를 다시 붙이려고 한다. 어떻게 해야할까?


deliciouslearning@gmail.com

8258-4838

deliciouslearning@hanamil.net

8348-4584

 

이메일도 섞여 있으므로 앞의 사례처럼 모든 행 앞에 일괄적으로 010- 문자열을 첨가할 수는 없다. 


일단, 전화번호에 해당하는 정규표현식을 찾는다. 가운데 하이픈(-)을 중심으로 숫자가 연속되는 열이므로 다음과 같다.


[0-9]\+-[0-9]\+ → (숫자의 연속)(-)(숫자의 연속) 형태의 문자열

\d\+-\d\+ [0-9]는 \d와 동일함

 

위의 정규 표현식을 [바꿀 문자열]에 사용하면 사례에서 나온 모든 휴대폰 번호를 특정해낼 수 있다.

 

그리고 여기에 010- 이라는 문자열을 앞에 붙여야 한다. [바뀐 문자열]에 이를 어떻게 적어야 할까?


[바뀐 문자열]은 번호마다 전부 다르므로 단순한 문자열을 배치하긴 어렵다. [바꿀 문자열]에서 정규 표현식으로 검색한 각각의 내용을 [바뀐 문자열]에서 바로 재사용할 수 있으면 좋다.

 

[바꿀 문자열]에서 찾은 검색결과를 [바뀐 문자열]에서 재사용하고 싶다면 재사용하고 싶은 부분에 해당하는 표현식을 escape 된 소괄호로 감싸는 형식으로 만들어 주어야 한다. 그러면 [바꿀 문자열]에서 escape 된 소괄호로 둘러싸인 부분을 왼쪽에서 오른쪽으로 순서대로 센 것과 [바뀐 문자열]에서 \1~\9가 다음과 같이 각각 대응하게 된다.

 


[바꿀 문자열] \(표현식1\)\(표현식2\).....\(표현식9\)

[바뀐 문자열] →     \1         \2    .....     \9

 

, [바꿀 문자열]에서 escape 된 소괄호로 둘러싸인 부분[바뀐 문자열]에서 9개까지 순서대로 재사용할 수 있는 것이다.


이를 응용하면 앞에서 전화번호 앞에 010- 문자열을 붙이는 것은 다음과 같다.

 

:%s/\(\d\+-\d\+\)/010-\1/g

 

Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


044 vim 문자열 바꾸기에서 슬래쉬(_) 및 정규표현식 사용.apkg


밀란 쿤데라의 농담은 지금으로부터 20년 전 1998년에 읽었고 그 이후 밀란 쿤데라의 책은 전부 읽어보게 되었다. 밀란 쿤데라의 다른 책은 거의 기억에 남아있지 않고 단편적인 인상만 남아있는 수준에 불과하지만 농담만은 여전히 강렬한 기억으로 남아있다. 20년이 지나도 당시에 읽으면서 받았던 충격이 종종 환기된다는 점에 종종 스스로 놀라게 된다.

 

20년 전 읽은 책이니 세세한 부분은 잘 기억나지 않는다. 아마도 기억은 많이 왜곡되었을 것이고 스스로 미화하거나 덧붙인 이야기들도 있을 것이다. 하지만 농담을 다시 읽고 기억을 바로잡고 서평을 쓰고 싶지는 않았다. 20년 동안 끈질기게 남아있는 것이 무엇인지 쓰고 싶기 때문이다.

 

이야기는 굉장히 많은 인물들의 디테일한 상황이 펼쳐지고 각자의 생각과 고민이 어우러지면서 전개된다. 하지만 거의 기억이 나지 않는다. 그 중 거의 중심인물로 보이는 등장인물이 루드비크인데, 그는 젊었을 때 공산주의 학생회 같은 곳에서 활동했는데 항상 유쾌하고 유머감각이 있는 친구였다. 하지만 그의 유쾌한 농담은 당시 경직된 공산주의의 경건함과 잘 맞지 않았다. 결국당시 리더였던 학생회장과 여자친구는 그가 한 농담이 자본주의적인 천박함을 드러낸 것이고 이를 교화할 필요가 있다는 취지의 고발을 했고 그 결과 수용소 같은 곳에 들어가 인생이 망가졌다.


그를 고발한 학생회장은 당시 공산당에서 승승장구했고 지금은 명망있는 교수가 되어서 성공한 인생을 살고 있었다. 루드비크는 수용소를 나와 자신을 고발한 학생회장에게 복수하기 위해서 그의 아내를 유혹한다. 

 

각자의 생각과 고민 속에서 사람들은 전통 마을 축제에 모이게 된다. 루드비크는 학생회장의 아내와 잠자리를 갖고 다정하게 팔짱을 끼고 학생회장 곁을 지나간다. 하지만 지금은 교수가 된 학생회장은 그의 부인이나 그가 파멸에 이르게 한 루드비크에 관심이 없다. 그는 옆에 20대의 젊은 여대생과 팔짱을 끼고 축제를 즐길 뿐이다.

 

기억이 정확한지는 모르겠지만 대략 이런 이야기였다. 그리고 마지막 장면이 충격적이었다. 학생회장에게 복수하기 위해서 그의 아내와 잠자리를 가진 루드비크는 그 학생회장의 옆에서 팔짱을 끼고 있는 20대의 젊은 여대생을 보면서 오히려 그 학생회장을 부러워한다. 학생회장은 예전의 경직된 모습은 없고 여유롭고 성공한 모습으로 인생을 즐기고 있는데, 자신은 복수해 보겠다고 아등바등 발악하면서 젊고 아름다운 여대생과 비교되는 늙은 부인과 잠자리를 한 것이다. 이러니 오히려 스스로 더 비참해지는 것이다.

 

그러면서 갑자기 상념에 빠진다. 정치적인 이데올로기에 몰두하여 모두가 경건하고 보수적인 시절 농담 한 마디로 인하여 수용소에 들어가 인생이 망가진 자신의 이야기를 미국인처럼 옷차림이 개방적이고 당당한 젊은 여학생에게 말한다면 그 여학생은 어떻게 생각할까? 아마도 상식적으로 일어나기 어려운 그런 일이 어떻게 일어날 수 있겠느냐며 옛 사람들이 하는 농담 정도로 듣고 말 것이라고 생각한다.

 

루드비크의 상념이 정확히 그런 상념이었는지는 모르겠지만 내 속에는 그렇게 남아있다. 그리고 그 뒤의 이야기는 어떻게 끝났는지 전혀 기억나지 않는다.

 

밀란 쿤데라는 그 특유의 위트나 그 문체의 여유로움으로 자신만의 독특한 세계를 구축한 것으로 깊은 인상을 주었던 작가이다. 하지만 농담은 쿤데라 특유의 여유롭고 방관자적인 관조가 잘 느껴지지 않는 작품이었다. 아마도 쿤데라의 다른 소설을 읽고 농담을 읽었다면 기대했던 여유와 위트를 찾지 못해 당황했을 것이다. 그럼에도 불구하고 농담은 가장 쿤데라적인 위트와 유머감각이 넘치는 작품이라고 생각한다. 왜냐하면 그 소설 전체가 하나의 커다란 농담이기 때문이다.

 

농담에서 농담은 곳곳에 등장한다. 루드비크를 파멸에 이르게 한 농담은 사건의 결정적 분기점으로 작동한다. 작가는 각종 아이러니한 상황을 제시하면서 유머감각을 은근히 드러내고 있다. 하지만 이 모든 농담은 마지막 장면에서 결정적 클라이막스에 도달한다.

 

가장 달콤하고 통쾌했어야할 복수의 순간에 루드비크는 학생회장의 옆에 있는 젊은 여자를 보면서 오히려 그를 부러워하고 스스로 비참해진다. 무슨 통찰이나 자신에 대한 성찰을 통하여 변화하는 것이 아니라 그저 젊고 개방적이면서 아름다운 여자가 학생회장 옆에 있다는 것만으로 자신에 대해 성찰하고 자신의 시대를 통찰하게 되는 것이 무슨 농담 같은 상황이다. 인생의 가장 좋았을 시기를 수용소에서 갇혀 노동을 해야 했고 거의 가진 것 없이 꿈도 희망도 없이 사회에 다시 내던져지고 다시 복수를 하는 서사에서 주인공 루드비크는 나름 그 자신의 서사가 있는 등장인물이었다. 사소한 실수로 숙청당했건, 사상적 차이로 숙청당했건 나름 자신의 비극 속에서 삶을 살아가는 주체적인 등장인물이었던 것이다. 그런데 그 모든 것이 학생회장 옆에 있는 여성의 매력으로 인하여 한 순간에 무의미하고 쓸모없는 일들로 무화되었다는 점이 내가 생각한 작가의 첫 번째 치명적인 농담이었다. 그리고 읽었을 당시에는 속으로는 참 등장인물이 여자를 밝히는 속물정도로 생각했지만 실은 절대적으로 공감해서 20년 동안 기억 속에 남아있다는 점이 나로서는 두 번째 농담이었다.

 

마지막은 농담은 루드비크와 학생회장 등이 각자의 생각과 고민 속에서 아등바등 살면서 했던 선택들이 당사자의 입장이 아닌 다음 세대가 볼 때에는 전혀 이해할 수 없는 이상한 일들이라는 점이다. 소설 속의 등장인물들은 매순간 자신의 상황 속에서 존재의 이유와 존재 형식을 끊임없이 자문한다. 독자로서 그것을 읽을 때에는 그 등장인물이 그럴 수밖에 없겠구나 하고 동의하게 된다. 그런데 정작 주인공인 루드비크는 젊은 여대생을 보고 갑자기 제 3자의 입장에서 시대와 인생을 통찰하면서 그 동안 아등바등 살았던 자신의 무겁고 질척거리던 인생을 한갖 농담으로 볼 수 있게 된 것이다. 인생이 한갖 농담으로 전환되는 이 농담은 나에게 뼈를 때리는 아픔을 주면서도 갑자기 그동안 지고 있었던 삶의 무게를 한갖 농담으로 보게 해주었다. 겨우 농담 한번 하고 싶은 것을 참지 못해서 수용소로 간 루드비크나 친구가 겨우 농담한 것을 참지 못해서 수용소로 보낸 학생회장이나 옆에서 그냥 보기에는 무슨 농담같은 일이고 모든 분노와 증오가 예쁘고 어린 여대생에게 인정받을 수 있다면 거짓말처럼 사라질 것 같은 것도 농담같은 일이다. 마치 스스로가 큰 서사의 주인공인양 스스로 그렇게 할 수 밖에 없는 상황을 끊임없이 역설하지만 실은 자신의 상황에 매몰되어서 비극의 주인공으로 스스로 생각하지만 옆에서 보기에는 그저 희극인 것이다.

 

당시, 무용담처럼 내려오는 선배들의 학생운동 이야기들, 군대 이야기들, 역사들이 소설 농담에 겹쳐졌다. 그리고 내가 매몰되어 있던 삶이 이 이야기에 겹쳐졌다. 내 삶의 이야기들도 결국 술자리에서 풀어놓는 농담같은 것이 될 것이라는 것을 알았다. 그저 그런 것이다.

 

+ Recent posts