Làm cách nào để chỉnh sửa các tệp không tương tác (ví dụ: trong đường ống)?


24

Tôi muốn chỉnh sửa các tệp được truyền trong đầu vào đường ống bằng cách sử dụng vim theo cách không tương tác hoặc chỉnh sửa các tệp tại chỗ (tương tự sed).

Một vài ví dụ sử dụng sed:

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

Tuy nhiên tôi có thể đọc ở đây , rằng:

sedlà một S tream ED itor, không phải là một trình soạn thảo tập tin. Tuy nhiên, mọi người ở khắp mọi nơi có xu hướng lạm dụng nó để cố gắng chỉnh sửa các tập tin. Nó không chỉnh sửa tập tin.

Thứ hai, một số tùy chọn như chỉnh sửa tại chỗ ( -i) là di động.

Làm thế nào cùng chức năng có thể đạt được trong vim?


Tôi nghĩ rằng bạn có thể thả thứ hai filetừ dòng lệnh thứ hai của bạn.
joeytwiddle

@joeytwiddle Xong.
kenorb

Câu trả lời:


33

Để chỉnh sửa tệp không tương tác bằng cách sử dụng ex( vilà chế độ trực quan cho ex), bạn có thể sử dụng +{command}hoặc -c {command}tham số cho phép bạn thực hiện các lệnh vi sau khi tệp đầu tiên được đọc.

Đây exlà một trình soạn thảo dòng lệnh tiêu chuẩn (tương tự ed).

Ngoài ra còn có vipe(một trình soạn thảo ống lệnh Vim) nên được sử dụng là một phần của moreutilsgói và nó sẽ cho phép bạn chạy trình soạn thảo của mình ở giữa một đường ống unix và chỉnh sửa dữ liệu đang được chuyển giữa các chương trình.

Ví dụ

Cú pháp đầu vào và đầu ra tiêu chuẩn đơn giản có thể đạt được bằng cú pháp shell này:

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

Dưới đây là ví dụ đơn giản về cách in tệp sau khi thay thế:

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

Thêm ví dụ để chỉnh sửa tập tin tại chỗ:

$ 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' {} \;

Bạn cũng có thể sử dụng -s {scriptin}để các lệnh được tải từ tệp, ví dụ:

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

hoặc sử dụng chuyển hướng I / O:

$ vim file < cmds.vim

Để chỉnh sửa một tệp và lưu các thay đổi sang tệp khác, hãy kiểm tra các ví dụ sau:

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

Ví dụ thực tế hơn.

Ví dụ thực tế trực tiếp từ đặc tả 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

Trích xuất thẻ html :

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

Xóa các thẻ XML :

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

Xóa thẻ kiểu khỏi tiêu đề và in đầu ra được phân tích cú pháp:

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

Phân tích cú pháp html với nhiều quy tắc phức tạp:

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

Thậm chí nhiều ví dụ:


Xem thêm:



5
Đây là một UUOC ; chỉ cần sử dụng vim '+:0,$s/foo/test/g' '+:wq! file2' file1thay thế.
Doorknob 14/2/2015

2
Lưu ý rằng, ít nhất một số trong các ví dụ này không tuân thủ POSIX, chẳng hạn , bufdo. Mặc dù Vim là thứ được cài đặt hầu như ở mọi nơi, nhưng đáng để biết rằng bạn có thể chỉnh sửa tập tin bằng cách chỉ sử dụng các tính năng tương thích POSIXex .
tự đại diện

Câu hỏi & câu trả lời này là điều đầu tiên thôi thúc tôi tìm hiểu exvà thực sự tìm hiểu nó. Cảm ơn bạn. Một số đọc thêm về chủ đề này (tiết lộ đầy đủ: Tôi đã viết những điều này;) là: đảo ngược bốn dòng vớiexsử dụng -ctùy chọn . Bạn có thể thêm chúng vào danh sách liên kết của bạn ở phía dưới, nếu bạn muốn. :)
tự đại diện
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.