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 -i
est pour la modification sur place.)
Version plus portable:
ed file <<!
1s/^/<?php /
wq
!
sed
, et il permet d'ajouter un suffixe de sauvegarde.
-i
n'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 -0777
force le fichier slurping, donc tout le fichier est lu sur une seule ligne. -p
active le bouclage. -i
permet 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.bak
au 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.
-i
indicateur 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 -p
drapeau) peut gâcher votre journée entière autrement.
sed
sert à éditer des flux - un fichier n'est pas un flux. Utilisez un programme conçu à cet effet, comme ed
ou ex
. L' -i
option to sed
n'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 find
one-liner :)
$FNAME
devrait ê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