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?
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?
Réponses:
sed -i "1s/^/<?php /" file
(Le -iest pour la modification sur place.)
Version plus portable:
ed file <<!
1s/^/<?php /
wq
!
sed, et il permet d'ajouter un suffixe de sauvegarde.
-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.
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/\$/ ?>/" {} \;
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.
-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.
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
edà cette fin, montrez-le dans votre réponse.
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 :)
$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.
Il y a le moyen simple
echo "startstr$(cat filename)endstring" > filename.new