adiciona texto em arquivos multipule recursivamente em uma linha específica

0

Eu quero adicionar {% load static%} à segunda linha em todos os arquivos html no diretório

esta é a minha estrutura de pastas.

 ├── fullstack
│   └── index.html
├── git
│   ├── 1.html
│   ├── 2.html
│   ├── 3.html
│   ├── 4.html
│   ├── 5.html
│   └── git.html
├── home.html
├── html_css
│   ├── 10.html
│   ├── 11.html
│   ├── 12.html
│   ├── 13.html
│   ├── 14.html
│   ├── 15.html
│   ├── 1.html
│   ├── 2.html
│   ├── 3.html
│   ├── 4.html
│   ├── 5.html
│   ├── 6.html
│   ├── 7.html
│   ├── 8.html
│   ├── 9.html
│   └── html-css.html
├── javascript
│   ├── 10.html
│   ├── 11.html
│   ├── 12.html
│   ├── 13.html
│   ├── 14.html
│   ├── 15.html
│   ├── 16.html
│   ├── 1.html
│   ├── 2.html
│   ├── 3.html
│   ├── 4.html
│   ├── 5.html
│   ├── 6.html
│   ├── 7.html
│   ├── 8.html
│   ├── 9.html
│   └── javascript.html
└── projects
    ├── facebook_project
    │   ├── 10.html
    │   ├── 11.html
    │   ├── 12.html
    │   ├── 13.html
    │   ├── 14.html
    │   ├── 15.html
    │   ├── 1.html
    │   ├── 2.html
    │   ├── 3.html
    │   ├── 4.html
    │   ├── 5.html
    │   ├── 6.html
    │   ├── 7.html
    │   ├── 8.html
    │   ├── 9.html
    │   └── facebook-project.html
    ├── one_mac_project
    │   ├── 10.html
    │   ├── 11.html
    │   ├── 1.html
    │   ├── 2.html
    │   ├── 3.html
    │   ├── 4.html
    │   ├── 5.html
    │   ├── 6.html
    │   ├── 7.html
    │   ├── 8.html
    │   ├── 9.html
    │   └── one-mac-project.html
    └── projects.html
    
por Ahmed Alrifai 21.03.2018 / 03:39

1 resposta

1

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.

    
por 21.03.2018 / 07:31