Use o vim para manipular arquivos em scripts bash

Recentemente, fui confrontado com a situação de ter que editar 44 arquivos semelhantes e fazer muitas manipulações neles. A mesma manipulação para cada arquivo. Parece muito trabalho de macaco, então fiz um script para isso usando bash e vim para algumas partes.

Vamos imaginar que queremos remover uma única linha de cada arquivo. Esta linha é identificada por conter a palavra foo:

for file in directory/*; do
vim
"$file" -s <(echo -e "/foo/nddn:wq")
done

Feito! Espere, o que aconteceu aqui?!?

Vamos passar por isso passo a passo:

  1. Nós iteramos sobre os arquivos, isso é uma coisa bem básica do bash.
  2. Abrimos o arquivo no vim.
  3. O -ssinalizador diz ao vim para usar o arquivo após o sinalizador como uma entrada do usuário. Os comandos são executados no modo normal, para que você possa navegar pelo arquivo, etc., normalmente.
  4. O <(command arg0 arg1)é uma sintaxe especial de bash que cria um descritor de arquivo temporário na memória, portanto, em vez de especificar um arquivo de entrada real, você pode gerar o conteúdo do arquivo. Isso também pode ser útil para situações complexas de vários fluxos, mas aqui queremos apenas embutir nossos comandos em vez de criar um arquivo de script separado.
  5. echo -e imprime o texto que damos com o tratamento adequado para caracteres especiais.
  6. /foo/salta para a primeira ocorrência de foo.
  7. ddexclui a linha sob o cursor, portanto, como saltamos para a primeira ocorrência de foo, ele exclui a linha que continha a string foo.
  8. :wq Salva o arquivo e fecha o vim.

Isso é tudo que há para fazer! Espero que você encontre algum uso para isso!

NOTA: Você provavelmente desejará ter um HEAD limpo em seu controle de origem antes de fazer isso, ou fazer backups. Há muitas coisas que podem dar errado aqui, por exemplo, se o arquivo não contém foo, a primeira linha é excluída.