Disons que j'ai un répertoire avec environ 100 .rtf
fichiers que je modifie avec LibreOffice Writer.
Je souhaite que tous les fichiers de ce répertoire aient exactement les mêmes directives de style de texte riche de base, par exemple:
* 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;
Et ainsi de suite ... Donc, fondamentalement, je veux changer tous les fichiers en même temps. Un tel "style en vrac" est-il possible?
Peut-être que c'est possible avec la CLI d'une manière ou d'une autre?
libreoffice
style
JohnDoea
la source
la source
Réponses:
Utilisez les outils Libreoffice au lieu de CLI
Lorsque vous ne disposez que d'outils de ligne de commande, tout ressemble à un problème de ligne de commande. J'ai décidé d'écrire cette réponse en utilisant les macros LibreOffice:
.rtf
fichier de document Writer (Rich Text Format) Writer.Créer des données de test
Créez deux fichiers ou plus contenant:
Créer un script
~/Downloads/copy-rtf.sh
contenant:Marquer comme exécutable en utilisant
*.rtf
fichiers de modification des macros s'exécuteront dans le~/Downloads
répertoire.cd ~/Downloads
et exécution./copy-rtf.sh
Le répertoire Téléchargements est utilisé car:
~/Downloads
/tmp/
répertoire qui peut ne pas persister lors des redémarrages.Exécuter une macro dans un environnement sans tête
À l'aide de cette réponse Stack Exchange, appelez Libreoffice Writer à partir de la ligne de commande et passez-lui un nom de macro global à exécuter:
La réponse ci-dessus peut ne pas fonctionner, donc une autre méthode peut être essayée:
Installer Java Runtime Environment
Pour exécuter des macros, vous devez installer Java Runtime Environment (JRE). La page Web du développeur contient des instructions pour télécharger et installer manuellement.
Cependant, cette Q&A AU: /ubuntu//a/728153/307523 suggère qu'elle est aussi simple que:
J'ai essayé la méthode AU Q&A et après la première étape de l'ajout du PPA, un écran de démarrage apparaît avec des informations supplémentaires. Le plus utile est un lien vers la configuration de JRE 8 sur les systèmes Debian .
La troisième étape de l'installation de JRE 8 nécessite que vous utilisiez Tabet Enteracceptiez le contrat de licence. Votre machine s'arrêtera pendant quelques minutes pendant la partie la plus lourde de la routine d'installation.
Maintenant, ouvrez LibreOffice et sélectionnez Outils -> Options -> LibreOffice -> Avancé et configurez cet écran:
Cliquez sur les options pour:
LibreOffice Writer Macro
La macro lira tout le document et:
La macro enregistrera le document et quittera Libreoffice Writer.
Désactiver la boîte de dialogue
Faites un enregistrement de fichier et cette boîte de dialogue apparaît:
Désactivez ce message comme indiqué à l'écran. La macro peut ne pas s'exécuter correctement si cette option est activée.
Contenu de la macro
J'ai passé quelques jours à essayer d'enregistrer une macro en utilisant "Outils" -> "Macros" -> "Enregistrer la macro" -> "Basique". Au début, cela semblait prometteur, mais la macro enregistrée avait un comportement incohérent et a dû être abandonnée pour une macro de base manuscrite. Une aide trouvée dans Stack Overflow pour un expert là-bas pour m'aider avec le codage de base de base . Voici le résultat:
la source
Voici une approche unique en utilisant Libre Office. Ce n'est pas un lot, mais cela peut aider à inspirer d'autres réponses.
Ouvrez un fichier rtf qui a la police Ubuntu, H1 à 28 pt, du texte à 12 pt et certains à 18 pt.
Voici un exemple:
Les étapes suivantes appliqueront la modification demandée dans votre question "si taille de police: 18px {faites-le 22px} # Tout le texte avec la taille de police 18px est maintenant 22px;"
Cliquez sur Édition → Rechercher et remplacer dans le menu ou appuyez sur CtrlHAutres options Cliquez sur la case Rechercher, puis sur le bouton Attributs Taille de la police, puis sur le bouton Format, sélectionnez 18 pt dans la boîte de défilement à l'extrême droite Cliquez sur Remplacer par, puis sur le bouton Format et sélectionnez 22 pt dans la boîte de défilement à l'extrême droite
Cliquez sur Remplacer tout
la ligne applicable qui a changé était:
\ 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
le fs36 a changé en fs44
le seul autre champ qui a changé était le champ revtime que vous souhaitiez ou non mettre à jour:
{\ revtim \ yr2018 \ mo3 \ dy31 \ hr22 \ min19}
Savoir ce qui a changé nous fournit un modèle pour développer une approche par lots. Il est probablement possible d'enregistrer une macro qui le fait à l'ouverture d'un document ou de développer un script qui apporte les modifications souhaitées.
la source
Il y a quelques excellents indices sur la façon dont on pourrait s'y prendre dans la spécification RTF.
Voici mon analyse du problème.
Réaliser cela en utilisant la CLI comme vous le supposez semble être l'approche la plus simple car je n'ai vu aucune application basée sur une interface graphique pouvant gérer ce type de conversion par lots. Il semble que vous pouvez simplement modifier l'en-tête:
Personnellement, après examen de ces informations, il me semble que tout ce que vous essayez de faire semble être pris en charge dans l'en-tête, de la sélection de la police au style.
Il y a des outils disponibles pour vous aider dans ce processus que je vais décrire ci-dessous car je n'ai pas d'exemple du style de document que vous avez ni du style de document que vous voulez et une réponse plus générique sera probablement plus utile à la communauté que un ciblé sur votre situation exacte.
grep
sera utile pour analyser les fichiers existants à convertir et un échantillon du style cible pour existantes<fonttbl>
et<stylesheet>
sélections. Après avoir déterminé ce que vous avez réellement, vous devriez pouvoir écrire un script simple en utilisantsed
pour remplacer le contenu d'en-tête existant par le contenu d'en-tête souhaité. Il existe de nombreux exemples sur la façon de parcourir les fichiers dans un script bash ( exemple ) et comment utiliser sed ( exemple ) librement disponible si vous n'êtes pas familier avec ces concepts.Il existe également une option de ligne pour remplacer une chaîne dans un fichier. Certains peuvent fonctionner mieux que d'autres en fonction de votre cas d'utilisation. Selon le contenu de vos fichiers, il peut ou non être judicieux de remplacer simplement chaque instance de
fs36
Avecfs44
quel shell vous utilisez peut également avoir une incidence sur la meilleure façon d'écrire vos expressions. En fonction de la complexité et le contenu de vos documents , vous pouvez être mieux d'utilisersed
,perl
ougrep
peut - être même une combinaison d'entre eux. Comme cela est devenu une question de programmation, il est préférable de vous référer à /programming/15402770/how-to-grep-and-replace où vous trouverez facilement une 1/2 douzaine d'approches différentes, l'une des qui est susceptible de répondre parfaitement à vos besoins.Par exemple, si vous souhaitez appliquer ces modifications à l'échelle du système,
find /path/to/files -type f -exec sed -i 's/oldstring/newstring/g' {} \;
tel que fourni par rezizter est probablement le meilleur.Si vous souhaitez contenir vos modifications dans un seul répertoire,
grep -rl matchstring somedir/ | xargs sed -i 's/fs36/fs44/g'
tel que fourni par billtian est un excellent choix.Pour être sûr, vous devez prétraiter les fichiers pour vous assurer que les modifications que vous apporterez n'auront pas de conséquences inattendues. Par exemple:
Ce qui précède affichera les lignes contenant la chaîne de recherche fs36 pour chaque fichier .rtf du répertoire.
Éditer:
La spécification la plus récente peut être obtenue ici. Je ne vois aucun changement qui devrait avoir un impact sur cette approche.
la source
rtf
avec un en-tête et un textesed
afin que la réponse soit centraliséesed
.