Como editar arquivos de maneira não interativa (por exemplo, no pipeline)?


24

Gostaria de editar arquivos passados ​​na entrada de pipeline usando o vim de maneira não interativa ou editar arquivos no local (semelhante a sed).

Poucos exemplos 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.

No entanto, eu poderia ler aqui , que:

sedé um editor ED do S tream , não um editor de arquivos. No entanto, pessoas de todos os lugares tendem a abusar dele por tentar editar arquivos. Não edita arquivos.

Em segundo lugar, algumas opções, como edição in-loco ( -i), são portáteis.

Como a mesma funcionalidade pode ser alcançada no vim?


Eu acho que você pode largar o segundo fileda sua segunda linha de comando.
joeytwiddle

@joeytwiddle Concluído.
Kenorb # 17/15

Respostas:


33

Para editar o arquivo de forma não interativa usando ex( vié o modo visual ex), você pode usar +{command}ou -c {command}parâmetros que permitem executar os comandos vi após a leitura do primeiro arquivo.

O exé um editor de linha de comando padrão (semelhante a ed).

Também vipedeve ser usado (um editor de canal de comando do Vim) que faz parte do moreutilspacote e isso permitirá que você execute seu editor no meio de um pipeline unix e edite os dados que estão sendo canalizados entre os programas.

Exemplos

Entrada e saída padrão simples usando pipes podem ser alcançadas por esta sintaxe do shell:

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

Aqui está um exemplo simples de como imprimir o arquivo após a substituição:

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

Mais exemplos para editar arquivos no local:

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

Você também pode usar -s {scriptin}para que os comandos sejam carregados do arquivo, por exemplo:

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

ou usando o redirecionamento de E / S:

$ vim file < cmds.vim

Para editar um arquivo e salvar as alterações em outro, verifique os seguintes exemplos:

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

Exemplos mais práticos.

Exemplo ao vivo real da especificação 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

Extraindo tags html :

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

Removendo tags XML :

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

Removendo a marca de estilo do cabeçalho e imprima a saída analisada:

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

Analise o html com várias regras complexas:

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

Ainda mais exemplos:


Veja também:



5
Este é um UUOC ; basta usar vim '+:0,$s/foo/test/g' '+:wq! file2' file1.
Doorknob

2
Observe que pelo menos alguns desses exemplos não são compatíveis com POSIX, por exemplo bufdo,. Embora o Vim seja o que está instalado virtualmente em qualquer lugar, vale a pena saber que é possível criar scripts para edição de arquivos usando apenas os recursos compatíveis com POSIXex .
Wildcard

Esta pergunta e resposta foi o que primeiro me inspirou a estudar exe realmente aprender. Obrigado. Algumas leituras adicionais sobre esse assunto (divulgação completa: escrevi estas;) são: revertendo a cada quatro linhas comex e usando a -copção . Você pode adicioná-los à sua lista de links na parte inferior, se desejar. :)
Curinga
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.