Come sostituire il testo tra due marcatori in un file con una sezione di testo da un altro file?


8

Supponiamo di avere un blocco di testo in ~/.bashrc:

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

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

# other commands

Vorrei sostituire quel blocco di testo con qualche altro testo contenuto tra due marcatori in un altro file: 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...

ho provato

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

Ma sto davvero oscillando nel buio qui. Qualcuno potrebbe darmi una mano?

  1. Come estraggo il testo da stuff-to-place-in-bashrc.txt?

  2. Come posso sostituire l'altra sezione ~/.bashrccon il testo estratto dalla domanda 1?

modificare

Grazie per gli aggiornamenti ragazzi, quelli che si chiedono perché vorrei qualcosa del genere:

consente aggiornamenti scelti con cura per i file di script senza sovrascrivere le aggiunte fatte dall'utente. utile per ambienti operativi standard condivisi e aggiornati di frequente (come il mio ultimo lavoro in Tyro codificato con XP).

impazzire ragazzi.


Vedere anche il testo di cattura tra parentesi graffe in C file di pre-elaborata . Cambia "parentesi graffe" con i tuoi token di inizio e fine ( # aliasese # end aliases), e potrebbe funzionare per te.

Risposte:


9

Ed è l'editor standard, perché puoi usarlo per sviluppare script ed e lasciarlo fare, come hai testato prima, in modo interattivo. Per file piccoli come .bashrco qualsiasi testo in codice, ed è performante perché legge l'intero file in un colpo solo e funziona con il buffer. Per lo stesso motivo non dovresti usare ed per file di grandi dimensioni come i file di registro.

Ma con uno script ed, il tuo lavoro si svolge in pochissimo tempo:

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

Uso script simili per ottimizzare automaticamente i file di configurazione, come ad esempio .asoundrc per diversi ambienti in cui porto il mio laptop.

Il miglior documento su ed arriva come una semplice pagina di manuale dal fantastico sistema PLAN9 . L'ho tradotto in un documento Postscript ed.ps. Se sei interessato a PLAN9 , dovresti controllare 9front e http://cat-v.org/ poiché la versione originale dei laboratori di campana è ancora mantenuta ma ha un filesystem molto semplice.

Un'ultima parola su editor di guerre, emacs, vim e simili: regole acme!


Grazie per la risposta, ha funzionato, tuttavia non sono sicuro di quale sia la sintassi. Usa regex o qualcosa di più specifico per ed? sembra che ci siano comandi simili a vim ( w, q)
thenaglecode

Usa regex ( /^# aliases, e /^# end aliases/) e gli altri comandi sono Vi / Ed. Vedere, ad esempio, vimhelp.appspot.com/cmdline.txt.html#%3Arange per +, /^# end aliases/.
Muru,

1
vedere info Edsul tuo sistema (si spera). Non so perché le moderne distribuzioni di Linux non installino questo fantastico editor. w e q sono comandi di scrittura ed uscita. Ed funziona in modo molto simile a sed con regexes. C'è un motivo per cui i nomi sembrano così simili. d significa eliminare le righe indirizzate, -r legge nella riga precedente i risultati del !comando che segue. Accorcio i nomi dei file sulla modifica, dato che sono così pigro a scrivere questa mattina presto.
Ikrabbe,

1
@thenaglecode guarda la mia ultima modifica. Ho dovuto provarlo prima di pubblicarlo.
Ikrabbe,

1
@thenaglecode L'unica e unica pagina veramente buona su ed di cui abbia mai avuto bisogno era la pagina ed (1) di plan9: man.cat-v.org/plan_9/1/ed . Se ti va, posso inviarti una versione PostScript. Dato che stiamo parlando di plan9, vedi anche l'editor di acme. Se ti ci abitui, non userai mai qualcos'altro. Ovviamente è meglio usare un sistema plan9, ad esempio come una macchina virtuale all'interno del tuo box di Linux, ma anche la porta p9p per unix è fantastica. (Ci sono piccole differenze tra plan9 ed e gnu ed!)
ikrabbe il

2
set /^\#aliases/  /^\#end\ aliases/
sed -ne"$1,$2"'s/\\\{0,1\}/&&/gp' <stuff_to_place...rc |
sed -e"$1,$2c\" -f- ./infile >./outfile

Se si vuole modificare il file sul posto edè una molto buona soluzione. Se vuoi modificarlo in-stream, usa sed. Evitare sed -i.


0

Certo, puoi farlo da edsolo, senza bisogno di strumenti aggiuntivi:

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

se sei soddisfatto del risultato, sostituiscilo ,pcon w /home/username/.bashrcper scrivere le modifiche ~/.bashrc(nota il percorso completo usato con re w; puoi semplicemente usarlo .bashrcse è dentro cwd).
Come funziona: deliminiamo innanzitutto le linee non necessarie stuff_to_place.txt. Quindi eliminiamo quelli rimanenti (gli alias) con ,d. Il buffer di testo è ora vuoto mentre il buffer di taglio contiene le righe desiderate. Quindi rinseriamo il contenuto .bashrcnel buffer di testo, inseriamo il contenuto del buffer di taglio ( x) dopo la /# aliases/riga, dupliciamo l'ultima riga incollata ( .t.) quindi eliminiamo dalla riga duplicata fino a ma non includendo /# end aliases/e infine print o write cambia e quit.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.