비 대화식으로 파일을 편집하는 방법 (예 : 파이프 라인)?


24

비 대화식 방식으로 vim을 사용하여 파이프 라인 입력으로 전달 된 파일을 편집하거나 파일을 내부에서 편집하고 싶습니다 (와 유사 sed).

다음을 사용하는 몇 가지 예 sed:

$ sed -i'.bak' s/foo/test/g file   # Edit file in-place.
$ cat file | sed s/foo/test/g      # Parse file in pipeline.

그러나 나는 여기서 읽을 수 있습니다 .

sedA는 S tream ED 당사 홈페이지가 아닌 파일 편집기. 그럼에도 불구하고 모든 곳의 사람들은 파일을 편집하려고 시도하여 파일을 남용하는 경향이 있습니다. 파일을 편집하지 않습니다.

두 번째로 내부 편집 ( -i) 과 같은 일부 옵션 은 이식 가능합니다.

vim에서 어떻게 동일한 기능을 수행 할 수 있습니까?


file두 번째 명령 줄에서 두 번째 명령을 내릴 수 있다고 생각합니다 .
joeytwiddle

@joeytwiddle 완료했습니다.
kenorb

답변:


33

ex( vi의 시각적 모드 ex임)를 사용하여 비 대화식으로 파일을 편집하려면 첫 번째 파일을 읽은 후 vi 명령을 실행할 수있는 매개 변수 +{command}또는 -c {command}매개 변수를 사용할 수 있습니다.

ex(유사한 표준 명령 줄 편집기입니다 ed).

이 또한 vipe의 일부인 사용되어야한다 (Vim은 명령 파이프 편집기) moreutils패키지와는 것입니다 당신이 프로그램 사이의 파이프되고있는 유닉스 파이프 라인 및 편집 데이터의 중간에 편집기를 실행할 수 있습니다.

파이프를 사용한 간단한 표준 입력 및 출력은이 쉘 구문으로 달성 할 수 있습니다.

$ ex -sc'%p|q!' <(echo Example)
$ echo Example | ex -sc'%p|q!' /dev/stdin

다음은 대체 후 파일을 인쇄하는 방법에 대한 간단한 예입니다.

$ ex /etc/hosts +%s/127/128/ge -sc'%p|q!'

내부 파일 편집에 대한 추가 예 :

$ ex +'%s/127/128/g' -cswq file
$ ex -sc '%s/olddomain\.com/newdomain.com/g|x' file
$ printf '%s\n' 'g/olddomain\.com/s//newdomain.com/g' w q | ex -s file
$ ex -s "$file" <<< $'g/old/s//new/g\nw\nq'
$ ex -sc 'argdo %s/old/new/ge|x' ./**
$ find . -type f -exec ex -sc '%s/old/new/g|x' {} \;

다음 -s {scriptin}과 같이 파일에서 명령이로드되도록 사용할 수도 있습니다 .

$ printf "%s\n" '%s/foo/test/ge' 'wq' > cmds.vim
$ vim -s cmds.vim -es file

또는 I / O 리디렉션 사용 :

$ vim file < cmds.vim

한 파일을 편집하고 다른 파일에 변경 사항을 저장하려면 다음 예제를 확인하십시오.

$ ex +%s/127/128/g -sc'wq! new_file' /etc/hosts
$ cat /etc/hosts /etc/fstab | vim - -es '+:%s/foo/test/g' '+:wq! file3'

더 실용적인 예.

리얼 라이브 예 로부터 RPM의 사양 :

vim -E -s Makefile <<-EOF
   :%substitute/CFLAGS = -g$/CFLAGS =-fPIC -DPIC -g/
   :%substitute/CFLAGS =$/CFLAGS =-fPIC -DPIC/
   :%substitute/ADAFLAGS =$/ADAFLAGS =-fPIC -DPIC/
   :update
   :quit
EOF

html 태그 추출 :

ex -s +'bufdo!/<div.*id=.the_div_id/norm nvatdggdG"2p' +'bufdo!%p' -cqa! *.html

XML 태그 제거 :

ex -s +'%s/<[^>].\{-}>//ge' +%p +q! file.txt

헤더에서 스타일 태그를 제거 하고 구문 분석 된 출력을 인쇄하십시오.

curl -s http://example.com/ | ex -s +'/<style.*/norm nvatd' +%p -cq! /dev/stdin

여러 복잡한 규칙으로 HTML구문 분석하십시오 .

ex -V1 $PAGE <<-EOF
  " Correcting missing protocol, see: https://github.com/wkhtmltopdf/wkhtmltopdf/issues/2359 "
  %s,'//,'http://,ge
  %s,"//,"http://,ge
  " Correcting relative paths, see: https://github.com/wkhtmltopdf/wkhtmltopdf/issues/2359 "
  %s,[^,]\zs'/\ze[^>],'http://www.example.com/,ge
  %s,[^,]\zs"/\ze[^>],"http://www.example.com/,ge
  " Remove the margin on the left of the main block. "
  %s/id="doc_container"/id="doc_container" style="min-width:0px;margin-left : 0px;"/g
  %s/<div class="outer_page/<div style="margin: 0px;" class="outer_page/g
  " Remove useless html elements. "
  /<div.*id="global_header"/norm nvatd
  wq " Update changes and quit.
EOF

더 많은 예 :


참조 :



5
이것은 UUOC입니다 . 단순히 vim '+:0,$s/foo/test/g' '+:wq! file2' file1대신 사용하십시오.
Doorknob

2
이 예 중 적어도 일부는 POSIX와 호환되지 않습니다 (예 :) bufdo. Vim은 거의 모든 곳에 설치되지만 POSIX 호환 기능 만 사용하여 파일 편집을 스크립팅 할 있다는 것을 아는 것이 좋습니다 . ex
와일드 카드

이 질문과 답변은 내가 처음으로 ex그것을 보고 실제로 배우 도록 영감을 준 것입니다. 고맙습니다. 이 주제에 대한 더 읽기 (전체 공개 : 나는이 쓴)입니다 : 와 매 4 선을 반전ex 하고, 사용 -c옵션을 . 원하는 경우 하단의 링크 목록에 추가 할 수 있습니다. :)
와일드 카드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.