Comment ajouter une balise au début de plusieurs fichiers?

18

J'ai besoin d'ajouter des balises PHP entourant un fichier. Il est facile de les ajouter en utilisant

find . -exec echo "?>" >> '{}' \;

mais comment puis-je ajouter le tag <?php?

Gilles 'SO- arrête d'être méchant'
la source

Réponses:

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

(Le -iest pour la modification sur place.)

Version plus portable:

ed file <<!
1s/^/<?php /
wq
!
user1686
la source
astucieux - c'est un peu plus facile que ce que j'allais décrire :)
warren
J'ai besoin d'ajouter l'extension à l'argument -i ici. Utilisez-vous sed ou GNU sed?
Richard: Celui que j'utilise prétend être GNU sed, et il permet d'ajouter un suffixe de sauvegarde.
user1686
2
J'utilise BSD sed, et il permet l'édition sur place, mais je dois lui donner une extension. ie 'sed -i .bak "PATTERN" file'
3
-in'est pas portable, la syntaxe diffère entre les implémentations et elle casse les liens symboliques. Vous feriez mieux d'utiliser une application réellement conçue pour éditer des fichiers.
Chris Down
5

Vous pouvez utiliser un AWKfiltre comme celui-ci,

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

PREFIXest votre chaîne de préfixe php.

nik
la source
5

Je ne peux pas encore laisser de commentaire, mais pour tout faire en une seule étape:

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

la source
J'adore ça, ça m'a fait gagner des heures.
Steve Hill du
5

Vous pouvez le faire avec un perl one-liner:

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

Le mode -0777force le fichier slurping, donc tout le fichier est lu sur une seule ligne. -pactive le bouclage. -ipermet la modification sur place du fichier. ^indique le début d'une ligne.

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

Mise à jour: comme indiqué dans les commentaires, vous pouvez choisir de générer automatiquement une sauvegarde en utilisant -i.bakau lieu de -i. Cela offre une sécurité supplémentaire en cas d'erreurs dans votre commande. L'argument to -i devient le suffixe de la sauvegarde.

Lors de la mise à jour d'un groupe de fichiers, vous pouvez exécuter la commande avec -i.backup${RANDOM}, vérifier que tous les fichiers sont correctement mis à jour, puis supprimer tous les fichiers avec cette extension.

nagul
la source
1
"La valeur 0777 entraînera Perl à slurper les fichiers entiers car il n'y a pas d'octet légal avec cette valeur" voir sial.org/howto/perl/one-liner/#s3.5
Chris W. Rea
1
Si vous recommandez d'utiliser l' -iindicateur sans suffixe, veuillez avertir les lecteurs que cela signifie que vous n'obtenez aucune sauvegarde . Pour quelques caractères de plus ( -i.bak), vous obtenez une sauvegarde au cas où votre one-liner comprend une faute de frappe. Une faute de frappe assez simple (par exemple, en oubliant le -pdrapeau) peut gâcher votre journée entière autrement.
Télémaque le
@Telemachus - D'accord. Mis à jour.
4

sedsert à éditer des flux - un fichier n'est pas un flux. Utilisez un programme conçu à cet effet, comme edou ex. L' -ioption to sedn'est pas seulement non portable, elle cassera également tous les liens symboliques que vous pourriez rencontrer, car elle les supprime essentiellement et les recrée, ce qui est inutile.

for file in foo bar baz; do
    ed -s "${file}" << EOF
0a
<?php 
.
w
EOF
done
Chris Down
la source
Ce que vous avez présenté est un moyen simple de modifier un seul fichier. Cela ne semble pas résoudre le problème - la question concerne la modification d'un certain nombre de fichiers (même si cela peut ne pas être évident à première vue). Si vous savez comment l'utiliser edà cette fin, montrez-le dans votre réponse.
rozcietrzewiacz
@rozcietrzewiacz - Puisque grawity a démontré la même méthode d'édition d'un seul fichier (qui a été accepté), j'ai pensé que c'était approprié à la réponse. Quoi qu'il en soit, je l'ai mis dans une boucle for, ce qui devrait apaiser vos inquiétudes.
Chris Down
0

Une alternative à ce que vous avez écrit pour ajouter quelque chose à la fin de chaque fichier du répertoire (in bash):

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

bien que j'aime votre findone-liner :)

garenne
la source
$FNAMEdevrait être $fname- par convention, nous capitalisons les variables d'environnement (PAGER, EDITOR, SHELL, ...) et les variables internes du shell (BASH_VERSION, RANDOM, ...). Tous les autres noms de variables doivent contenir au moins une lettre minuscule. Cette convention évite de remplacer accidentellement les variables environnementales et internes.
Chris Down
@Chris Down - la convention que j'ai vue toute ma carrière a varié en fonction des paramètres: minuscules, majuscules et chameau :)
warren
Le chameau et les minuscules sont très bien. Dans tous les cas, les variables qui ne sont pas des variables d'environnement ne doivent pas être en majuscules.
Chris Down
0

Il y a le moyen simple

echo "startstr$(cat filename)endstring" > filename.new
Hogan
la source
Cela rompra avec les nouvelles lignes de fin.
Chris Down
@ChrisDown suit les nouvelles lignes dans le fichier?
Hogan