Donc, j'ai un tas de fichiers dans un répertoire et j'ai besoin d'insérer une ligne de texte dans chacun d'eux. Ils ont essentiellement le format suivant:
<VirtualHost *:80>
ServerAdmin gabe@localhost
DocumentRoot /var/www/test1
ServerName test1.local
ServerAlias test1
<Directory "/var/www/test1">
Options All
AllowOverride All
</Directory>
</VirtualHost>
Et j'aimerais insérer une ligne avant la fermeture
</VirtualHost>étiquette. Ma première hypothèse est que je devrais être capable de le faire avec sed, probablement en faisant correspondre et en remplaçant cette balise. Je vais commencer à essayer maintenant, mais si quelqu'un a un moyen de le faire, j'aimerais l'entendre.
text-processing
sed
gabe.
la source
la source
Réponses:
Quelque chose comme ça:
travaux. Si vous souhaitez répéter cette commande sur un grand nombre de fichiers, vous pouvez faire quelque chose comme:
Probablement mieux (mais non testé) grâce à @ChrisDown:
la source
/
de l'expression sed est plus propre, car vous n'avez pas à échapper à la barre oblique:'s:</VirtualHost>:yourlinehere\n</VirtualHost>:'
Si cela ne vous dérange pas, essayez Perl:
Le
-i
commutateur enregistrera votre ancien fichier avec une.old
extension et l'imprimera dans le fichier actuel.la source
Vous pouvez également utiliser "ex" (ligne de commande vi) si l'édition que vous souhaitez effectuer est même quelque peu compliquée. Par exemple, vous ne souhaitez effectuer l'insertion que sur une seule instance de "".
Un script shell comme celui-ci peut fonctionner:
Cette approche vous donne les avantages de "ex": trouver un emplacement avec des motifs elaboarte et des "mouvements de curseur". Vous pouvez faire des choses comme trouver un motif, puis trouver l'instance suivante, PUIS faire l'insertion. Ou vous pouvez changer le texte, plutôt que de simplement faire des insertions. Ou vous pouvez changer entre les gammes. N'oubliez pas que "ex" vous permet d'utiliser "." comme la ligne actuelle, donc., / ^ somepatter / s / blah / foo / fonctionnera.
la source
Vous pouvez utiliser le code de ligne unique suivant pour insérer une seule ligne ou plusieurs lignes dans un emplacement donné dans un fichier, dans votre cas avant «VirtualHost». Le code recherche essentiellement le nom de fichier (il peut s'agir de *. *, Si vous souhaitez insérer les textes dans tous les fichiers) dans le répertoire donné et ses sous-répertoires. Dans les fichiers trouvés, il recherche le modèle «VirtualHost». Après avoir trouvé le modèle, il le remplace par firstline \ nsecondline \ notherlines \ n \ VirtualHost. Notez que «VirtualHost» fait partie du texte à remplacer, sinon nous le perdrons.
la source