
다음 내용이 포함된 파일이 있다고 가정해 보겠습니다.
이것은 교체하고 싶은 _특별한_ 키워드가 있는 _파일_입니다.
특정 키워드를 "%s/_*_/something"으로 검색하고 바꿀 수 있지만 "something"이 외부 명령의 출력이 되기를 바랍니다. vim에서 이것이 가능합니까, 아니면 awk가 필요합니까?
답변1
그래 넌 할수있어. 보다 :help sub-replace-special
; 이를 \=
통해 Vim 표현식으로 대체할 수 있습니다. 그리고 system()
외부 명령을 실행하고 해당 출력을 반환할 수 있습니다. 에 대한 나의 간단한 예를 참조하십시오 hostname
. substitute()
출력에서 후행 개행 문자를 제거하기 위해 사용해야 했습니다 .
:%s/_[^_]*_/\=substitute(system('hostname'),'\n','','g')/g
추신: 귀하의 예와 일치하도록 정규식 패턴도 수정했습니다.
답변2
나에게 많은 도움이 된 Ingos 답변에서는 일치의 하위 패턴을 참조하고 이를 쉘 명령에 대한 인수로 사용하는 방법을 알 수 없습니다("표현식을 인수로 사용하여 콘솔 명령에 의해 생성됨").
제 경우에는 다음과 같은 형식의 로그 라인이 있었습니다: [<unix timestamp>] <message>
, ie [1406844000] foobar
. 나는 사람이 읽을 수 있는 형식으로 시간을 앞에 붙이고 싶었습니다.
다음 vim 명령은 타임스탬프(부분 일치 1) 및 메시지(나머지, 부분 일치 2)를 일치시키고 date 명령의 시간 문자열을 앞에 추가합니다.
:% s/^\[\(\d\+\)\] \(.*\)$/\=substitute(system('date -d @'.submatch(1)),'\n', '', 'g').': ['.submatch(1).'] '.submatch(2)/
[1406844000] foobar
을 얻습니다 Fr 1. Aug 00:00:00 CEST 2014: [1406844000] foobar
.
HTH
답변3
ldiff 파일에서 base64 대체의 경우:
:%s/:: \(.*\)$/\=substitute(': ' . system('echo '.submatch(1).'|base64 -d'),'\n','','g')/