-835,6 +835,39 |
=== # (4) 153화 === |
=== # (5) 154화 === |
}}} |
=== # 따옴표 쌍 안에 있는 문자열에 대해서만 특정한 치환 적용하기 === |
예를 들어 Nginx 로그에는 따옴표 안에 공백 문자가 들어가 있어서, awk 등으로 필드를 쪼갤 때 많이 불편하다. 그래서 따옴표로 둘러싸인 내부에서만 공백 문자를 '_' 등으로 치환하고자 한다. |
{{{ |
ab cd "ef gh" ij kl "mn op qr" st uv |
=> ab cd "ef_gh" ij kl "mn_op_qr" st uv |
}}} |
첫번째 시도는 정규식의 lookbehind를 사용하여, "왼쪽에 따옴표가 홀수 번 있는" 경우에 한하여 치환을 하게 한다. |
{{{#!vim vim |
%s/\v(^([^"]*"[^"]*")*[^"]*"[^"]*)@<= /_/g |
}}} |
성공은 하는데, 11만 라인의 텍스트에서 수행하는데 95초 정도가 소요됨 |
챗GPT에게 물어봐서, 검색 결과를 vimscript의 함수에 넣어서 치환 |
{{{#!vim vim |
%s/\v"([^"]*)"/\= '"' . substitute(submatch(1), ' ', '_', 'g') . '"' /g |
}}} |
{{{ |
\v"([^"]*)" - 따옴표로 둘러싸인 부분만 검색 |
\= - 뒤에 오는 부분을 vimscript 식으로 평가 |
submatch(1) - 검색에서 ( ) 로 둘러싸여 캡처된 텍스트 |
substitute() - 공백을 _로 전역 치환 |
'"' 와 . - 문자열 연결 |
}}} |
== # 유용한 옵션들 == |
* set backupdir=~/.vim/backup |
** 이미 존재하는 화일을 수정하여 저장할 때 생성되는 백업화일 (화일명 뒤에 ~가 붙는다) 이 지저분하므로, 이런 백업화일이 지정된 디렉토리에 생성되게 한다 |