Comment remplacer du texte entre deux marqueurs d'un fichier par une section de texte d'un autre fichier?

8

Disons que j'avais un bloc de texte dans ~/.bashrc:

#~/.bashrc
# ...some commands...

# aliases
alias suicide='sudo rm -rf /'
# end aliases

# other commands

Je souhaite remplacer ce bloc de texte par un autre texte contenu entre deux marqueurs dans un autre fichier: stuff-to-place-in-bashrc.txt

# stuff-to-place-in-bashrc.txt
# ...stuff...

# aliases
alias ldir='ls * -d'
alias ithinklifeisworthliving='echo all good'
# end aliases

# ...more stuff...

J'ai essayé

 sed -ne 's/# aliases\s+\(.*\)\s+# end aliases/\1/' stuff-to-place-in-bashrc.txt

Mais je balance vraiment dans le noir ici. Est-ce que quelqu'un peut me donner un coup de main?

  1. Comment puis-je extraire le texte du stuff-to-place-in-bashrc.txt?

  2. Comment remplacer l'autre section ~/.bashrcpar le texte extrait de la question 1?

Éditer

Merci pour les mises à jour, ceux qui se demandent pourquoi je voudrais quelque chose comme ça:

permet des mises à jour triées sur le volet des fichiers de script sans remplacer les ajouts créés par l'utilisateur. utile pour les environnements d'exploitation standard partagés et fréquemment mis à jour (comme mon dernier travail chez Tyro qui codait avec XP).

devenez fou les gars.

thenaglecode
la source
Voir aussi Capture de texte entre accolades dans le fichier C prétraité . Modifiez les "accolades" avec vos jetons de début et de fin ( # aliaseset # end aliases), et cela peut fonctionner pour vous.

Réponses:

9

Ed est l'éditeur standard, car vous pouvez l'utiliser pour développer des scripts ed et le laisser faire son travail, comme vous l'avez testé auparavant, de manière interactive. Pour les petits fichiers comme .bashrcou tout texte de code, ed est performant car il lit le fichier entier en une seule fois et fonctionne avec le tampon. Pour la même raison, vous ne devez pas utiliser ed pour les gros fichiers comme les fichiers journaux.

Mais avec un script ed, votre travail se fait en un rien de temps:

ed ~/.bashrc<<EOF
/^# aliases
+,/^# end aliases/-1d
-r !sed -n '/^# aliases/,/^# end aliases/p' stuff-to-place-in-bashrc.txt|grep -v '^#'
w
q
EOF

J'utilise des scripts similaires pour régler automatiquement les fichiers de configuration, comme als .asoundrc pour différents environnements dans lesquels j'utilise mon ordinateur portable.

Le meilleur document sur ed vient comme une simple page de manuel du système PLAN9 très cool . Je l'ai traduit en un document postscript ed.ps. Si vous êtes intéressé par PLAN9, vous devriez vérifier 9front et http://cat-v.org/ car la version originale de bell labs est toujours maintenue mais a un système de fichiers très simple.

Un dernier mot sur les guerres des éditeurs, emacs, vim et autres: les règles d'acme!

ikrabbe
la source
Merci pour la réponse, cela a fonctionné, mais je ne suis pas sûr de la syntaxe. Utilise-t-il l'expression régulière ou quelque chose de plus spécifique à ed? semble qu'il existe des commandes de type vim ( w, q)
thenaglecode
Il utilise des expressions rationnelles ( /^# aliases, et /^# end aliases/), et les autres commandes sont Vi / Ed. Voir, par exemple, vimhelp.appspot.com/cmdline.txt.html#%3Arange pour +, /^# end aliases/.
muru
1
voir info Edsur votre système (j'espère). Je ne sais pas pourquoi les distributions Linux modernes n'installent pas cet éditeur sympa. w et q sont des commandes d'écriture et de sortie. Et ed fonctionne de manière très similaire à sed avec des regexes. Il y a une raison pour laquelle les noms sonnent autant. d signifie supprimer les lignes adressées, -r lit dans la ligne précédente les résultats de la !commande qui suit. Je raccourcis les noms de fichiers sur l'édition, car je suis tellement paresseux à taper ce matin.
ikrabbe
1
@thenaglecode voir ma dernière modification. J'ai dû tester cela avant de le poster.
ikrabbe
1
@thenaglecode La seule et vraiment bonne page sur ed dont j'ai jamais eu besoin était la page ed (1) de plan9: man.cat-v.org/plan_9/1/ed Je peux vous envoyer une version postscript si vous le souhaitez. Comme nous ne parlons que de plan9, consultez également l'éditeur acme. Si vous vous y habituez, vous n'utiliserez jamais autre chose. Bien sûr, il est préférable d'utiliser un système plan9, par exemple en tant que machine virtuelle dans votre box Linux, mais le port p9p pour unix est également très bien. (Il y a peu de différences entre plan9 ed et gnu ed!)
ikrabbe
2
set /^\#aliases/  /^\#end\ aliases/
sed -ne"$1,$2"'s/\\\{0,1\}/&&/gp' <stuff_to_place...rc |
sed -e"$1,$2c\" -f- ./infile >./outfile

Si vous souhaitez modifier le fichier sur place edest une très bonne solution. Si vous souhaitez le modifier en continu, utilisez sed. A éviter sed -i.

mikeserv
la source
0

Bien sûr, vous pouvez le faire edseul, sans avoir besoin d'outils supplémentaires:

ed -s stuff_to_place.txt<<\IN
1,/# aliases/d
/# end aliases/,$d
,d
.r /home/username/.bashrc
/# aliases/x
.t.
.,/# end aliases/-d
,p
q
IN

si vous êtes satisfait du résultat, remplacez ,ppar w /home/username/.bashrcpour écrire les modifications dans ~/.bashrc(notez le chemin complet utilisé avec ret w; vous pouvez simplement utiliser .bashrcs'il est dedans cwd).
Comment cela fonctionne: nous dsupprimons d' abord les lignes inutiles de stuff_to_place.txt. Ensuite, nous supprimons les autres (les alias) avec ,d. Le tampon de texte est maintenant vide tandis que le tampon de coupe contient les lignes que nous voulons. Nous rlisons ensuite le contenu de .bashrcdans le tampon de texte, mettons le contenu du tampon de coupure ( x) après la /# aliases/ligne, dupliquons la dernière ligne qui a été collée ( .t.) puis supprimons de la ligne dupliquée jusqu'à mais non inclus /# end aliases/et finalement print ou write changements et quit.

don_crissti
la source