명령 줄에서 표준 버퍼에 전체 버퍼를 쓰는 방법은 무엇입니까?


10

전체 버퍼를 /dev/stdout파일 대신 표준 출력 ( ) 에 쓰고 싶습니다 . 파일을 편집하는 동안 다음 명령이 예상대로 작동합니다.

:w >> /dev/stdout

힌트 : Control+ L를 눌러 화면을 새로 고칩니다.

그러나 명령 줄에서 ( 대화식이 아닌) 동일한 작업을 수행하려고하면 예상대로 작동하지 않습니다 .

$ echo This is example. | vim - '+:w >> /dev/stdout' '+:q!'
Vim: Reading from stdin...

와 같은 :w !tee, :x! /dev/stdout, :%print유사한.

종료하기 전에 다음과 같이 말합니다 [Device] 1L, 17C appended..

vim이 파이프 중간에 표준 출력에 표준 입력을 쓰도록 강제하는 방법이 있습니까? 어쩌면 버퍼링되어 있습니까?


4
궁금한 점은 무엇입니까? 마찬가지로 vim은 다른 도구가 아닌 다른 기능을 제공합니다.
Jay Thompson

1
@JayThompson vim대신 파일 구문 분석 에 사용하려고합니다 sed(예 : 여러 개의 큰 파일에 대한 복잡한 변경 사항을 대량 반복했습니다). 이 예는 단순하게 유지하고 다른 게시물 과 중복되지 않도록 아무 작업도 수행하지 않습니다 .
kenorb

vipe에 대해 알고 있으므로 사용하지 않는 이유는 무엇입니까?
muru

@muru 나는 많은 문서를 사용할 수없는, 아직 사용하지 않았고 그건 주제 오프 여기.
kenorb

vipe에 관한 질문 일 수도 있지만, 대답이되지 않을 이유는 없습니다. 그래서 왜 답변으로 게시해서는 안되는지 궁금합니다.
muru

답변:


9

버퍼를 쉘 표준 출력으로 인쇄하려면 vimEx 모드에서 시작해야합니다. 그렇지 않으면 자체 창에서 "정상"방식으로 열리고 종료시 출력 버퍼를 지 웁니다.

가장 간단한 작업 예는 다음과 같습니다.

$ echo foo | vim -e '+%print' '+q!' /dev/stdin
foo

또는 더 짧은 :

$ echo foo | ex +%p -cq! /dev/stdin
$ echo foo | ex +"%p|q!" /dev/stdin

참고 : 명령 vim -e은 기본적으로 ex명령 과 동일합니다 .

/dev/stdin추가적인 성가신 메시지를 방지하기 위해 표준 입력에 대한 특수 파일 디스크립터를 지정해야합니다 ( ).


다음은 구문 분석 문자열이 포함 된 예입니다.

$ echo This is example. | vim -e '+s/example/test/g' '+%print' '+q!' /dev/stdin
This is test.
$ echo This is example. | vim - -es '+s/example/test/g' '+%print' '+q!'
Vim: Reading from stdin...
This is test.

참고 : 마지막 예제는 숨길 수없는 성가신 메시지를 보여줍니다. 전체 파일을 메모리로 읽고 표준 입력에서 읽었다 고 말하는 표준 전략 때문입니다. 첫 번째 예제는 메시지없이 작동합니다. 파일이 EOF (End-of-File ) 신호 없이 끝없는 데이터를 생성 하므로 입력 읽기의 끝에 도달하지 않습니다.


관련 :


1
당신은 +q!오히려 오히려 할 수 +:q!있습니까?
Andrew

@AndrewMacFie 감사합니다.
kenorb

3

vipemoreutils패키지의 일부인 파이프 라인을 편집하기위한 편리한 도구입니다 . 편집자를위한 래퍼입니다 ( vi이름을 제공 하는 것을 포함하여 ). 그것은 사용 EDITOR의 사용을 다른 도구와 마찬가지로, 그래서 편집기를 설정하는 환경 변수 EDITOR(예 : crontab, visudo, 등) 그 변수를 사용하여 수행 할 수 있습니다 스크립트 작업. 예를 들어 다음과 같이 변경할 수 있습니다.

$ echo foo | EDITOR='vim +:s/foo/bar/ +wq' vipe | tail
bar

물론 복잡한 행동은 지옥을 인용하는 것으로 이어질 수 있으므로 스크립트를 작성할 수 있습니다.

#! /bin/sh

vim "+:s/foo/bar" '+wq' "$@"

그리고 사용하십시오 EDITOR="sh /path/to/script".

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.