Script de shell para adicionar ou substituir bloco de texto?

0

Estou procurando um script de shell (Bash) que adicione ou substitua o texto de direitos autorais no início do arquivo (para .c e .h files).

Ele deve pesquisar e adicionar ou substituir o bloco de texto de direitos autorais de todos os arquivos .c e .h do diretório pai no qual eu executo meu script.

Texto de direitos autorais existente:

            /* --------------------------------------------------
                Copyright 2014 Author name

                All rights reserved
             ----------------------------------------------------*/

Novo texto de direitos autorais.

             /* Copy right text bla bla bla
              * some license text bla bla bla
              * All rights reserved xyz xyz */

Nota

  1. O texto de direitos autorais deve ser adicionado no início do arquivo ( .c e .h ) apenas e sempre o texto de direitos autorais existente estará no início do arquivo.

  2. Ele deve pesquisar e adicionar ou substituir todos os arquivos .c e .h nos diretórios e subdiretórios pai.

EDITAR

Isso é o que eu tentei:

      for file in 'find . -type f -name "*.h"'
       do
       echo $file
       if grep -qRin "                            ----------------------------------------------------------------------\*\/" $file
        then
       echo "Replaced License Text"
         sed '1,/^ ----------------------------------------------------------------------\*\/$/d' < $file | cat licence_file - > $file.new
       mv $file.new $file
      else
    cat licence_file $file >$file.new && mv $file.new $file
     echo "Added License Test"
     fi
      done

Licence_file contém meu novo texto de licença.

    
por Thushi 05.12.2014 / 09:51

2 respostas

1

ed é 'o editor de texto padrão'. Não é realmente ideal para usar na edição do dia-a-dia, mas é prontamente programável .

ed file.c <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF

O primeiro comando exclui da primeira linha, até e incluindo a primeira linha contendo */ (tanto o * quanto o / precisam ser escapados). O segundo comando é uma inserção simples - o i diz ed para entrar no modo 'inserir', enquanto . informa por si próprio ed para sair do modo de inserção. w significa 'gravar' e salva o arquivo; q significa 'sair'. A coisa toda está dentro de um 'here-document', que começa e termina com um EOF (isso é arbitrário; você pode usar qualquer string que quiser).

Isso pode facilmente ser usado em um loop:

for f in ./*.{c,h}; do ed "$f" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF
done

Se você quiser recursividade (ou seja, trabalhar em subdiretórios), use shopt -s globstar e use ./**/*.{c,h} no comando acima ou use find e um loop while:

find . -name '*.c' -name '*.h' -print0 | while read -d '' f; do ed "$f" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF
done

Se você puder fazer isso muitas vezes, talvez valha a pena colocá-lo em um script.

#!/bin/sh
ed "$1" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF

Se você nomear algo como copyright.sh, coloque-o em algum lugar em seu $ PATH e torne-o executável, então você pode simplesmente:

shopt -s globstar
for f in ./**/*.{c,h}; do copyright.sh "$f"; done
    
por 05.12.2014 / 18:06
0

Um pouco confuso, mas esse python funcionará:

#!/usr/bin/python
import sys
filename = sys.argv[1]
fo=open(filename,'r+')
fr=fo.read()
frs=fr.replace('/* --------------------------------------------------\n                Copyright 2014 Author name\n\n                All rights reserved\n             ----------------------------------------------------*/','/* Copy right text bla bla bla\n* some license text bla bla bla\n* All rights reserved xyz xyz */')
fo.seek(0,0)
fo.write(frs)
fo.close()

Isso funciona se o texto original e o texto de substituição forem exatamente no mesmo formato (incluindo as linhas de hífen), conforme fornecido na pergunta. Chame este python do diretório onde os arquivos existem usando:

for i in ./{*.c,*.h} ; do python <scriptname.py> $i ; done

Como funciona:

Simples. Ele apenas abre os arquivos e substitui as linhas dadas entre o primeiro par de aspas simples na linha frs=fr.replace.... com as linhas dadas no segundo par de aspas simples dadas na mesma linha.

    
por 05.12.2014 / 14:40