2012-06-28 7 views
7

Sto cercando di inserire un contenuto di un file prima di un dato modelloUsando sed di inserire il contenuto del file

Ecco il mio codice:

sed -i "" "/pattern/ { 
i\\ 
r $scriptPath/adapters/default/permissions.xml" 
}" "$manifestFile" 

aggiunge il percorso invece del contenuto del file.

Qualche idea?

risposta

20

Per inserire il testo prima dello un motivo, è necessario scambiare lo spazio del motivo nello spazio di attesa prima di leggere nel file. Per esempio:

sed "/pattern/ { 
     h 
     r $scriptPath/adapters/default/permissions.xml 
     g 
     N 
    }" "$manifestFile" 
+0

Lo script deve essere citato in due, altrimenti $ scriptPath non verrà espanso. Potresti spiegare perché è necessario N alla fine? – hipe

+0

@hipe Il comando r accoda solo la lettura per l'inserimento nel flusso di output. In realtà non legge nulla fino alla fine del ciclo o quando viene letta la riga successiva. Senza N il file non verrebbe inserito fino a dopo la stampa dello spazio del motivo, rendendolo funzionale come un'appendice anziché un inserto. È * molto * non intuitivo. –

+0

Funziona bene per me grazie mille – ridan

4

Basta rimuovere i\\.

Esempio:

$ cat 1.txt 
abc 
pattern 
def 

$ echo hello > 2.txt 

$ sed -i '/pattern/r 2.txt' 1.txt 

$ cat 1.txt 
abc 
pattern 
hello 
def 
+3

Si inserisce dopo il modello. Come inserire il contenuto prima di esso? – ridan

1

ho avuto qualcosa di simile utilizzando awk. Sembra brutto, ma ha fatto il trucco nel mio test:

comando:

cat test.txt | awk ' 
/pattern/ { 
    line = $0; 
    while ((getline < "insert.txt") > 0) {print}; 
    print line; 
    next 
} 
{print}' 

test.txt:

$ cat test.txt 
some stuff 
pattern 
some other stuff 

insert.txt:

$ cat insert.txt 
this is inserted file 
this is inserted file 

uscita:

some stuff 
this is inserted file 
this is inserted file 
pattern 
some other stuff 
0

soluzione CodeGnome non funzionano, se il modello è l'ultima linea di .. così ho usato 3 comandi.

sed -i '/pattern/ i\ 
     INSERTION_MARKER 
     ' $manifestFile 
sed -i '/INSERTION_MARKER/r $scriptPath/adapters/default/permissions.xml' $manifestFile 
sed -i 's/INSERTION_MARKER//' $manifestFile 
Problemi correlati