Domanda

Per elaborare un mucchio di dati e renderlo pronto per essere inserito nel nostro database, generiamo un mucchio di script di shell. Ognuno di essi ha circa 15 righe, una per ogni tabella su cui stanno andando i dati. Uno di un batch di importazione recente, alcuni dei file di importazione non sono riusciti a entrare in una tabella particolare. Quindi, ho un sacco di script di shell (circa 600) in cui ho bisogno di commentare le prime 7 righe, quindi rieseguire il file. Ci sono circa 6000 script di shell in questa cartella e nulla su un determinato file può dirmi se ha bisogno di essere modificato. Ho un elenco di quali file ho estratto dall'output del database.

Quindi, come posso scrivere uno script bash (o qualsiasi altra cosa che funzioni meglio) per prendere questo elenco di nomi di file e per ciascuno di essi, commentare le prime 7 righe ed eseguire lo script?

EDIT:

#!/usr/bin/env sh

cmd1
cmd2
cmd3
cmd4
cmd5
cmd6
cmd7
cmd8

Non sono sicuro di quanto sia leggibile. Fondamentalmente, le prime 7 righe (senza contare la prima riga) devono avere un # aggiunto all'inizio di esse. Nota: i file sono stati modificati per rendere ogni riga più corta e tagliare parzialmente la copia da VIM. Ma nella parte principale di ogni file, c'è una linea che inizia con echo, quindi una linea che inizia con sqlldr

È stato utile?

Soluzione

Usando sed, puoi specificare un intervallo di numeri di riga nel file da modificare.

#!/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"

Potresti voler provare questo prima di eseguirlo su tutti quegli script ...

EDIT: ha cambiato i numeri di riga per riflettere i commenti.

Altri suggerimenti

In parole povere:

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

Supponendo che non ti interessi controllare le condizioni di gara ecc.

ex sembra fatto per quello che vuoi fare.

Ad esempio, per modificare un file, con un documento qui:

#!/bin/sh

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

Questo commenterà le prime 12 righe in " test.txt " ;. Per il tuo esempio puoi provare " $ FILE " o simili (comprese le virgolette!).

Quindi eseguili nel solito modo, ad esempio ./"$FILE"

modifica: $ SHELL " $ FILE " è probabilmente un approccio migliore per eseguirli (da uno dei commentatori sopra).

Alla fine vorrai usare il comando linux sed. Qualunque sia la logica che devi inserire nella sceneggiatura, lo sai. Ma la tua sceneggiatura alla fine chiamerà sed. http://lowfatlinux.com/linux-sed.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top