Devo aggiungere tag PHP che circondano un file. È facile accodarli usando
find . -exec echo "?>" >> '{}' \;
ma come posso anteporre il tag <?php
?
Devo aggiungere tag PHP che circondano un file. È facile accodarli usando
find . -exec echo "?>" >> '{}' \;
ma come posso anteporre il tag <?php
?
Risposte:
sed -i "1s/^/<?php /" file
( -i
È per la modifica sul posto.)
Versione più portatile:
ed file <<!
1s/^/<?php /
wq
!
sed
e consente di aggiungere un suffisso di backup.
-i
non è 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.
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/\$/ ?>/" {} \;
Puoi farlo con un one-liner perl:
perl -0777 -p -i -e "s/^/hey /g" testfile
Le -0777
forze di file-slurping modalità, quindi l'intero file viene letto come una riga. -p
abilita il looping. -i
abilita 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.bak
invece 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.
-i
bandiera 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 -p
bandiera) può rovinare l'intera giornata altrimenti.
sed
è per la modifica di flussi - un file non è un flusso. Utilizzare un programma pensato per questo scopo, come ed
o ex
. L' -i
opzione sed
non 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
ed
a tale scopo, mostralo nella tua risposta.
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 find
one-liner :)
$FNAME
dovrebbe 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.
C'è il modo semplice
echo "startstr$(cat filename)endstring" > filename.new