Este é um FAQ comum.
find . -type f -name '*.html' -exec sed -i '2s/^/{% load static %}/' {} \;
Nem todas as variantes sed
suportam -i
e algumas (notavelmente * BSD, incluindo MacOS) requerem um argumento vazio para a opção, como sed -i '' '2s/...
A expressão de endereço 2
corresponde à segunda linha e a expressão regular ^
corresponde ao início da linha; então estamos dizendo "substituir (a string vazia no) início de linha com este texto na linha 2".
Estou obviamente interpretando "adicionar à segunda linha" como inserindo este novo texto estático antes do conteúdo existente da linha. Existem outras operações que você poderia executar, como inserir uma nova linha ou substituir o conteúdo existente ou inserir o novo texto estático após o conteúdo atual da linha. Tudo isso é fácil de fazer com sed
, mas a sintaxe pode ser ligeiramente diferente em diferentes plataformas.
Se você não tem sed -i
, então talvez prefira usar o Perl.
find ... -exec perl -i -pe 's/^/{% load static %}/ if $. == 2; $. = 0 if eof' {} +
Com tantas palavras, find ... -exec x {} +
diz para executar x
em todos os arquivos que correspondem aos predicados em ...
. A diferença entre +
e \;
é que o primeiro executará o menor número possível de instâncias; então
x foundfile1.html path/to/foundfile2.html another/foundfile3.html ...
Considerando que com \;
você executa uma instância para cada arquivo:
x foundfile1.html
x path/to/foundfile2.html
x another/foundfile3.html
:
que é obviamente muito menos eficiente. Com a variante Perl, eu especificamente estruturei o script para que ele rastreie o número da linha para cada arquivo de entrada separadamente, para que você possa usar essa sintaxe mais eficiente (contanto que sua versão find
ofereça suporte); enquanto que com sed
, o endereço 2 corresponde apenas à segunda linha de toda a sequência de arquivos e, portanto, somos obrigados a executar uma instância desse script por arquivo.