Pergunta

Para processar um monte de dados e obtê-lo pronto para ser inserido em nosso banco de dados gerar um monte de scripts shell. Cada um deles tem cerca de 15 linhas, uma para cada tabela que os dados estão indo. Um um lote de importação recente, alguns dos arquivos de importação não entrar em uma mesa particular. Então, eu tenho um monte de scripts shell (cerca de 600) onde eu preciso comentar os primeiros 7 linhas, em seguida, execute novamente o arquivo. Existem cerca de 6000 shell scripts nesta pasta, e nada sobre um determinado arquivo pode me dizer se ele precisa de edição. Eu tenho uma lista de quais arquivos que eu puxei a partir da saída do banco de dados.

Então, como faço para escrever um script bash (ou qualquer outra coisa que iria trabalhar melhor) para levar esta lista de nomes de arquivo e para cada um deles, comente os primeiros 7 linhas, e executar o script?

EDIT:

#!/usr/bin/env sh

cmd1
cmd2
cmd3
cmd4
cmd5
cmd6
cmd7
cmd8

Não sei como legível que é. Basicamente, os primeiros 7 linhas (não contando a primeira linha) necessidade de ter um # adicionado ao início deles. Nota: os arquivos foram editados para fazer cada linha mais curta e parcialmente cortada copiando fora do VIM. Mas na parte principal de cada arquivo, há uma linha começando com echo, em seguida, uma linha começando com sqlldr

Foi útil?

Solução

usando sed, você pode especificar um intervalo de número de linha no arquivo a ser alterado.

#!/bin/bash

while read line
do
    # add a comment to beginning of lines 1 - 7 and rename the script
    sed '3,9 s/^/#/' $line > $line.new
    exec $line.new
done < "filelist.txt"

Você pode querer testar isso antes de executá-lo em todos os scripts ...

EDIT:. Mudou os números de linhas para refletir comentários

Outras dicas

A grosso modo:

#!/bin/sh
for file in "$@"
do
    out=/tmp/$file.$$
    sed '2,8s/^/#/' < $file > $out
    $SHELL $out
    rm -f $out
done

Assumindo que você não se preocupam com a verificação de condições de corrida, etc.

ex parece feito para o que você quer fazer.

Por exemplo, para editar um arquivo, com um documento aqui:

#!/bin/sh

ex test.txt << END
1,12s/^/#/
wq
END

Isso vai comentar as primeiras 12 linhas em "test.txt". Para o seu exemplo, você poderia tentar "$FILE" ou similar (incluindo aspas!).

Em seguida, execute-los da maneira usual, ou seja ./"$FILE"

edit:. $SHELL "$FILE" é provavelmente uma melhor abordagem para executá-los (de um dos comentadores acima)

Finalmente você vai querer usar o comando linux sed. Seja qual for a lógica, você precisa colocar no script, você sabe. Mas seu script acabará chamada sed. http://lowfatlinux.com/linux-sed.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top