vim 내의 정규식을 해당 표현식을 인수로 사용하여 콘솔 명령으로 생성된 출력으로 바꾸시겠습니까?

vim 내의 정규식을 해당 표현식을 인수로 사용하여 콘솔 명령으로 생성된 출력으로 바꾸시겠습니까?

다음 내용이 포함된 파일이 있다고 가정해 보겠습니다.

이것은 교체하고 싶은 _특별한_ 키워드가 있는 _파일_입니다.

특정 키워드를 "%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')/

관련 정보