Digamos que tengo un directorio con aproximadamente 100 .rtf
archivos que edito con LibreOffice Writer.
Deseo que todos los archivos en ese directorio tengan exactamente las mismas directivas básicas de diseño de texto enriquecido, por ejemplo:
* font-family: Ubuntu # All text in all files is now Ubuntu;
* font-size: 12px # All text in all files is now 12px big;
h1: 28px # All h1's are now 28px big;
if font-size: 18px {make it 22px} # All text with font-size 18px is now 22px;
Y así sucesivamente ... Entonces, básicamente quiero cambiar todos los archivos a la vez. ¿Es posible ese "estilo masivo"?
¿Tal vez es posible con la CLI de alguna manera?
libreoffice
style
JohnDoea
fuente
fuente
Respuestas:
Use las herramientas de Libreoffice en lugar de la CLI
Cuando todo lo que tiene son herramientas de línea de comando, todo parece un problema de línea de comando. He decidido escribir esta respuesta usando las macros de LibreOffice:
.rtf
archivo de documento del Escritor (Formato de texto enriquecido).Crear datos de prueba
Cree dos o más archivos que contengan:
Crear script que
~/Downloads/copy-rtf.sh
contenga:Marcar como ejecutable usando
*.rtf
archivos de modificación de macros se ejecutarán en el~/Downloads
directorio.cd ~/Downloads
y ejecución./copy-rtf.sh
El directorio de descargas se usa porque:
~/Downloads
/tmp/
directorio que puede no persistir entre reinicios.Ejecutar macro en un entorno sin cabeza
Usando esta respuesta de Stack Exchange, invoque Libreoffice Writer desde la línea de comando y pásele un nombre de macro global para ejecutar:
La respuesta anterior puede no funcionar, por lo que se puede probar otro método :
Instalar Java Runtime Environment
Para ejecutar macros, necesita tener instalado Java Runtime Environment (JRE). La página web del desarrollador tiene instrucciones para descargar e instalar manualmente.
Sin embargo, este AU Q&A: /ubuntu//a/728153/307523 sugiere que es tan simple como:
Probé el método AU Q&A y después del primer paso de agregar el PPA aparece una pantalla de bienvenida con información adicional. Lo más útil es un enlace para configurar JRE 8 en sistemas Debian .
El tercer paso para instalar JRE 8 requiere que use Taby Enteracepte el Acuerdo de licencia. Su máquina se detendrá durante unos minutos durante la parte más pesada de la rutina de instalación.
Ahora abra LibreOffice y seleccione Herramientas -> Opciones -> LibreOffice -> Avanzado y configure esta pantalla:
Haga clic en las opciones para:
LibreOffice Writer Macro
La macro leerá todo el documento y:
La macro guardará el documento y saldrá de Libreoffice Writer.
Desactivar el diálogo
Guarde un archivo y aparecerá este cuadro de diálogo:
Apague este mensaje como se muestra en la pantalla. Es posible que la macro no se ejecute correctamente si esta opción está activada.
Contenidos macro
Pasé unos días intentando grabar una macro usando "Herramientas" -> "Macros" -> "Grabar macro" -> "Básico". Al principio parecía prometedor, pero la macro grabada tenía un comportamiento inconsistente y tuvo que ser abandonada por una macro básica escrita a mano. Encontré ayuda en Stack Overflow para un experto que me ayudó con la codificación básica básica . Aquí está el resultado:
fuente
Aquí hay un enfoque único con Libre Office. No es un lote, pero puede ayudar a inspirar otras respuestas.
Abra un archivo rtf que tenga la fuente Ubuntu, H1 a 28 pt, algo de texto a 12pt y algo a 18 pt.
Aquí hay un ejemplo:
Los siguientes pasos aplicarán el cambio solicitado en su pregunta "if size-font: 18px {make it 22px} # Todo el texto con font-size 18px ahora es 22px;"
Haga clic en Editar → Buscar y reemplazar en el menú o presione CtrlHOtras opciones Haga clic en el cuadro Buscar y luego en el botón de atributos Casilla de verificación Tamaño de fuente y luego en el botón Formato seleccione 18 pt del cuadro de desplazamiento en el extremo derecho Haga clic en Reemplazar con el cuadro y luego en el botón Formato y seleccione 22 pt del cuadro de desplazamiento en el extremo derecho
Haga clic en Reemplazar todo
la línea aplicable que cambió fue:
\ par \ pard \ plain \ s0 \ ql \ widctlpar \ hyphpar0 \ ltrpar \ cf1 \ kerning1 \ dbch \ af7 \ langfe1081 \ dbch \ af7 \ afs24 \ alang1081 \ loch \ f3 \ fs24 \ lang1033 \ ql \ widctlpar \ hyphpar0 \ ltrpar {\ rtlch \ ltrch \ loch \ fs36 \ loch \ f6
el fs36 cambió a fs44
el único otro campo que cambió fue el campo revtime que puede o no querer actualizar:
{\ revtim \ yr2018 \ mo3 \ dy31 \ hr22 \ min19}
Saber lo que cambió nos proporciona un modelo para desarrollar un enfoque por lotes. Es probable que sea posible grabar una macro que haga esto al abrir un documento o desarrollar un script que realice los cambios que desee.
fuente
Hay algunas pistas excelentes sobre cómo se puede hacer esto en la especificación RTF.
Aquí está mi análisis del problema.
Lograr esto usando la CLI como supones parece ser el enfoque más simple, ya que no he visto ninguna aplicación basada en GUI que pueda manejar este tipo de conversión por lotes. Parece que simplemente puede modificar el encabezado:
Personalmente, al revisar esta información, se me ocurre que todo lo que intenta hacer parece admitido en el encabezado, desde la selección de fuente hasta el estilo.
Hay herramientas disponibles para ayudarlo con este proceso que resumiré a continuación, ya que no tengo un ejemplo del estilo de documento que tiene ni el estilo de documento que desea y una respuesta más genérica probablemente sea más útil para la comunidad que uno dirigido a su situación exacta.
grep
será útil para analizar los archivos existentes que se convertirán y una muestra del estilo de destino para los existentes<fonttbl>
y las<stylesheet>
selecciones. Una vez que haya determinado lo que realmente tiene, debería poder escribir un script simple utilizandosed
para reemplazar el contenido del encabezado existente con el contenido del encabezado deseado. Existen numerosos ejemplos de cómo iterar a través de archivos en un script bash ( ejemplo ) y cómo utilizar sed ( ejemplo ) disponible gratuitamente si no está familiarizado con estos conceptos.También hay opciones de una línea para reemplazar una cadena en un archivo. Algunos pueden funcionar mejor que otros dependiendo de su caso de uso. Dependiendo del contenido de sus archivos, puede tener sentido o no reemplazar simplemente cada instancia de
fs36
Confs44
qué shell que está utilizando también puede tener relación con la mejor manera de escribir sus expresiones. Dependiendo de la complejidad y contenido de los documentos puede ser mejor usarsed
,perl
ogrep
o tal vez incluso una combinación de ellos. Como esto se ha convertido en una pregunta de programación, es mejor remitirlo a /programming/15402770/how-to-grep-and-replace, donde encontrará fácilmente media docena de enfoques diferentes, uno de que es probable que se adapte perfectamente a sus necesidades.Por ejemplo, si desea aplicar estos cambios en todo el sistema,
find /path/to/files -type f -exec sed -i 's/oldstring/newstring/g' {} \;
según lo provisto por rezizter es probablemente el mejor.Si desea contener sus cambios en un solo directorio,
grep -rl matchstring somedir/ | xargs sed -i 's/fs36/fs44/g'
según lo provisto por billtian es una excelente opción.Para estar seguro, debe preprocesar los archivos para asegurarse de que cualquier cambio que realice no tendrá consecuencias no deseadas. Por ejemplo:
Lo anterior mostrará las líneas que contienen la cadena de búsqueda fs36 para cada archivo .rtf en el directorio.
Editar:
La especificación más reciente se puede obtener aquí. No veo ningún cambio que deba afectar este enfoque.
fuente
rtf
con un encabezado y un textosed
para que la respuesta se centralicesed
.