¿Cómo reemplazar el texto entre dos marcadores en un archivo con una sección de texto de otro archivo?

8

Digamos que tenía un bloque de texto en ~/.bashrc:

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

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

# other commands

Deseo reemplazar ese bloque de texto con otro texto contenido entre dos marcadores en otro archivo: 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...

He intentado

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

Pero realmente estoy balanceándome en la oscuridad aquí. podria alguien ayudarme?

  1. ¿Cómo extraigo el texto de la stuff-to-place-in-bashrc.txt?

  2. ¿Cómo reemplazo la otra sección ~/.bashrccon el texto extraído de la pregunta 1?

Editar

Gracias por las actualizaciones chicos, aquellos que se preguntan por qué querría algo como esto:

permite actualizaciones seleccionadas por cereza para archivos de script sin sobrescribir las adiciones hechas por el usuario útil para entornos operativos estándar compartidos y actualizados con frecuencia (como mi último trabajo en Tyro que codificó con XP).

volverse locos chicos.

thenaglecode
fuente
También ver Captura de texto entre corchetes en C archivo preprocesado . Cambie las "llaves" con sus tokens de inicio y fin ( # aliasesy # end aliases), y puede funcionar para usted.

Respuestas:

9

Ed es el editor estándar, porque puede usarlo para desarrollar scripts ed y dejar que haga su trabajo, como lo probó anteriormente, de forma interactiva. Para archivos pequeños como .bashrco cualquier texto de código, ed es eficaz porque lee todo el archivo de una vez y funciona con el búfer. Por la misma razón, no debe usar ed para archivos grandes como archivos de registro.

Pero con un script ed, su trabajo se realiza en poco tiempo:

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

Utilizo scripts similares para ajustar automáticamente los archivos de configuración, como también .asoundrc para diferentes entornos a los que llevo mi computadora portátil.

El mejor documento sobre ed viene como una simple página de manual del genial sistema PLAN9 . Lo traduje a un documento PostScript ed.ps. Si está interesado en PLAN9 , debe verificar 9front y http://cat-v.org/ ya que la versión original de los laboratorios de campanas aún se mantiene pero tiene un sistema de archivos muy simple.

Una última palabra sobre editor wars, emacs, vim y similares: ¡reglas de acme!

ikrabbe
fuente
Gracias por la respuesta, ha funcionado, sin embargo, no estoy seguro de cuál es la sintaxis. ¿Utiliza expresiones regulares o algo más específico para ed? parece que hay comandos vim like ( w, q)
thenaglecode
Utiliza expresiones regulares ( /^# aliases, y /^# end aliases/), y los otros comandos son Vi / Ed. Ver, por ejemplo, vimhelp.appspot.com/cmdline.txt.html#%3Arange para +, /^# end aliases/.
muru
1
ver info Eden su sistema (con suerte). No sé por qué las distribuciones modernas de Linux no instalan este genial editor. w y q son comandos de escritura y salida. Y ed funciona de manera muy similar a sed con expresiones regulares. Hay una razón por la cual los nombres suenan tan similares. d significa eliminar las líneas direccionadas, -r lee en la línea anterior los resultados del !comando que sigue. Acorto los nombres de archivo en la edición, ya que soy muy vago escribiendo esta madrugada.
ikrabbe
1
@thenaglecode ver mi última edición. Tuve que probar eso antes de publicarlo.
ikrabbe
1
@thenaglecode Las únicas páginas realmente buenas sobre ed que alguna vez necesité fue la página ed (1) de plan9: man.cat-v.org/plan_9/1/ed. Puedo enviarle una versión postscript si lo desea. Como solo estamos hablando de plan9, vea también el Editor de acme. Si te acostumbras a eso, nunca usarás otra cosa. Por supuesto, es mejor usar un sistema plan9, por ejemplo, como una máquina virtual dentro de su Linux Box, pero el puerto p9p para Unix también es genial. (¡Hay pequeñas diferencias entre plan9 ed y 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 desea editar el archivo en el lugar, edes una muy buena solución. Si desea editarlo in-stream, use sed. Evitar sed -i.

mikeserv
fuente
0

Claro, puede hacerlo edsolo, sin necesidad de herramientas adicionales:

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 está satisfecho con el resultado, reemplácelo ,pcon w /home/username/.bashrcpara escribir los cambios ~/.bashrc(tenga en cuenta la ruta completa utilizada con ry w; simplemente puede usar .bashrcsi está en cwd).
Cómo funciona esto: primero delegimos las líneas innecesarias de stuff_to_place.txt. Luego eliminamos los restantes (los alias) con ,d. El búfer de texto ahora está vacío mientras que el búfer de corte contiene las líneas que queremos. Luego, rcolocamos el contenido .bashrcen el búfer de texto, colocamos el contenido del búfer de corte ( x) después de la /# aliases/línea, duplicamos la última línea que se pegó ( .t.), luego eliminamos de la línea duplicada pero no incluimos /# end aliases/y finalmente print o write cambios y quit.

don_crissti
fuente