Come posso anteporre un tag all'inizio di diversi file?


Risposte:


18
sed -i "1s/^/<?php /" file

( -iÈ per la modifica sul posto.)

Versione più portatile:

ed file <<!
1s/^/<?php /
wq
!

elegante - è un po 'più facile di quello che stavo per descrivere :)
warren,

Ho bisogno di aggiungere l'estensione all'argomento -i qui. Stai usando sed o GNU sed?

Richard: Quello che sto usando afferma di essere GNU sede consente di aggiungere un suffisso di backup.
user1686

2
Sto usando BSD sed, e permette il montaggio sul posto, ma devo dargli un'estensione. cioè "sed -i .bak" PATTERN "file"

3
-inon è portatile, la sintassi differisce tra le implementazioni e interrompe i collegamenti simbolici. Faresti meglio a utilizzare un'applicazione che è stata progettata per modificare i file.
Chris Down,

5

Puoi usare un AWKfiltro come questo,

awk '{if (NR == 1) printf "% s% s", "PREFIX", $ 0; else stampa $ 0} 'testfile> newfile

Dov'è la PREFIXtua stringa prefisso php.


5

Non posso ancora lasciare un commento, ma per fare tutto in un solo passaggio:

find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;

Lo adoro, mi ha risparmiato ore.
Steve Hill,

5

Puoi farlo con un one-liner perl:

perl -0777 -p -i -e "s/^/hey /g" testfile

Le -0777forze di file-slurping modalità, quindi l'intero file viene letto come una riga. -pabilita il looping. -iabilita la modifica sul posto del file. ^indica l'inizio di una riga.

$ cp testfile1 testfile; perl -0777 -p -i -e "s/^/hey /g" testfile; diff testfile testfile1
1c1
< hey asdf
---
> asdf

Aggiornamento: come indicato nei commenti, puoi scegliere di generare automaticamente un backup usando -i.bakinvece di -i. Ciò fornisce ulteriore sicurezza in caso di errori nel comando. L'argomento -i diventa il suffisso del backup.

Quando si aggiorna un gruppo di file, è possibile eseguire il comando con -i.backup${RANDOM}, verificare che tutti i file siano stati aggiornati correttamente, quindi rimuovere tutti i file con tale estensione.


1
"Il valore 0777 farà in modo che Perl esegua lo slurp dei file interi perché non esiste un byte legale con quel valore" vedi sial.org/howto/perl/one-liner/#s3.5
Chris W. Rea

1
Se si consiglia l'uso della -ibandiera senza un suffisso, si prega di avvisare i lettori che ciò significa che non si ottiene alcun backup . Per qualche personaggio in più ( -i.bak), ottieni un backup nel caso in cui il tuo one-liner includa un refuso. Un errore di battitura abbastanza semplice (diciamo, dimenticare la -pbandiera) può rovinare l'intera giornata altrimenti.
Telemaco,

@Telemachus - Concordato. Aggiornato.

4

sedè per la modifica di flussi - un file non è un flusso. Utilizzare un programma pensato per questo scopo, come edo ex. L' -iopzione sednon solo non è portatile, ma romperà anche tutti i collegamenti simbolici che potresti incontrare, poiché essenzialmente lo elimina e lo ricrea, il che è inutile.

for file in foo bar baz; do
    ed -s "${file}" << EOF
0a
<?php 
.
w
EOF
done

Quello che hai presentato è un modo di base per modificare un singolo file. Questo non sembra rispondere al problema: la domanda riguarda la modifica di un numero di file (anche se a prima vista potrebbe non essere ovvio). Se sai come utilizzare eda tale scopo, mostralo nella tua risposta.
rozcietrzewiacz,

@rozcietrzewiacz - Poiché grawity ha dimostrato lo stesso metodo di modifica di un singolo file (che è stato accettato), ho pensato che fosse appropriato alla risposta. Ad ogni modo, l'ho messo in un ciclo for, che dovrebbe alleviare le tue preoccupazioni.
Chris Down,

0

Un'alternativa a ciò che hai scritto per l'aggiunta di qualcosa alla fine di ogni file nella directory (in bash):

for FNAME in *
do
    echo "?>" >> $FNAME
done

anche se mi piace il tuo findone-liner :)


$FNAMEdovrebbe essere $fname- per convenzione, capitalizziamo le variabili di ambiente (PAGER, EDITOR, SHELL, ...) e le variabili di shell interne (BASH_VERSION, RANDOM, ...). Tutti gli altri nomi di variabili devono contenere almeno una lettera minuscola. Questa convenzione evita di ignorare accidentalmente le variabili ambientali e interne.
Chris Down,

@Chris Down - la convention che ho visto per tutta la mia carriera è variata impostando: minuscole, maiuscole e camelcase :)
warren

Camelcase e minuscole vanno bene. In entrambi i casi, le variabili che non sono variabili di ambiente non devono essere maiuscole.
Chris Down,

0

C'è il modo semplice

echo "startstr$(cat filename)endstring" > filename.new

Ciò si interromperà con le nuove righe finali.
Chris Down,

@ChrisDown trascina le nuove righe nel file?
Hogan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.