Come modificare i file in modo non interattivo (ad es. In pipeline)?


24

Vorrei modificare i file passati nell'input della pipeline usando vim in modo non interattivo o modificare i file sul posto (simile a sed).

Alcuni esempi usando sed:

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

Comunque potrei leggere qui , che:

sedè un S tream ED itor, non un editor di file. Tuttavia, le persone ovunque tendono ad abusarne per aver tentato di modificare i file. Non modifica i file.

In secondo luogo, alcune opzioni come la modifica sul posto ( -i) è portatile.

Come si può ottenere la stessa funzionalità in vim?


Penso che puoi eliminare il secondo filedalla tua seconda riga di comando.
joeytwiddle,

@joeytwiddle Done.
Kenorb,

Risposte:


33

Per modificare il file in modo non interattivo utilizzando ex( viè la modalità visiva per ex), è possibile utilizzare +{command}o -c {command}parametri che consentono di eseguire i comandi vi dopo la lettura del primo file.

Il exè un editor della riga di comando standard (simile a ed).

C'è anche vipe(dovrebbe essere usato un editor di pipe di comando Vim) che fa parte del moreutilspacchetto e ti permetterà di eseguire il tuo editor nel mezzo di una pipeline unix e modificare i dati che vengono inviati tra i programmi.

Esempi

Con questa sintassi della shell è possibile ottenere semplici input e output standard usando i pipe:

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

Ecco un semplice esempio di come stampare il file dopo la sostituzione:

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

Altri esempi per la modifica dei file sul posto:

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

È inoltre possibile utilizzare in -s {scriptin}modo che i comandi vengano caricati dal file, ad esempio:

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

o usando il reindirizzamento I / O:

$ vim file < cmds.vim

Per modificare un file e salvare le modifiche in un altro, controlla i seguenti esempi:

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

Esempi più pratici.

Vero esempio live dalle specifiche 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

Estrazione di tag html :

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

Rimozione dei tag XML :

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

Rimozione del tag di stile dall'intestazione e stampa dell'output analizzato:

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

Analisi HTML con più regole complesse:

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

Ancora più esempi:


Guarda anche:



5
Questo è un UUOC ; semplicemente usa vim '+:0,$s/foo/test/g' '+:wq! file2' file1invece.
Maniglia della porta

2
Si noti che almeno alcuni di questi esempi non sono compatibili con POSIX, ad esempio bufdo. Anche se Vim è ciò che viene installato praticamente ovunque, vale la pena sapere che è possibile eseguire lo script di modifica dei file utilizzando solo le funzionalità compatibili con POSIXex .
Wildcard il

Questa domanda e risposta è ciò che per primo mi ha ispirato a esaminare exe ad impararlo davvero. Grazie. Qualche ulteriore lettura su questo argomento (divulgazione completa: ho scritto queste;) è: invertire ogni quattro righe conex , e usando l' -copzione . Se lo desideri, puoi aggiungerli all'elenco dei collegamenti in fondo. :)
Wildcard,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.