Скажем, у меня есть каталог с около 100 .rtf
файлами, которые я редактирую с помощью LibreOffice Writer.
Я хочу, чтобы все файлы в этом каталоге имели одинаковые базовые директивы стилей для форматированного текста, например:
* 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;
И так далее ... Итак, я хочу изменить все файлы одновременно. Возможно ли такое «объемное моделирование»?
Может быть, это возможно с CLI как-то?
libreoffice
style
JohnDoea
источник
источник
Ответы:
Используйте инструменты Libreoffice вместо CLI
Когда все, что у вас есть, это инструменты командной строки, все выглядит как проблема командной строки. Я решил написать этот ответ, используя макросы LibreOffice:
.rtf
(Rich Text Format) файла документа Writer.Создать тестовые данные
Создайте два или более файлов, содержащих:
Создать скрипт,
~/Downloads/copy-rtf.sh
содержащий:Пометить как исполняемый файл, используя
*.rtf
файлы макросов будут работать с~/Downloads
каталогом.cd ~/Downloads
и запуска./copy-rtf.sh
Каталог загрузок используется потому что:
~/Downloads
/tmp/
каталог, который может не сохраняться при перезагрузке.Запускать макрос в безголовом окружении
Используя этот ответ Stack Exchange, вызовите Libreoffice Writer из командной строки и передайте ему глобальное имя макроса для выполнения:
Приведенный выше ответ может не сработать, поэтому можно попробовать другой метод :
Установите Java Runtime Environment
Для запуска макросов вам нужно установить Java Runtime Environment (JRE). На веб-странице разработчика есть инструкции по загрузке и установке вручную.
Однако эти вопросы и ответы AU: /ubuntu//a/728153/307523 предполагают, что это так же просто, как:
Я попробовал метод AU Q & A, и после первого шага добавления PPA появляется заставка с дополнительной информацией. Наиболее полезной является ссылка на настройку JRE 8 в системах Debian .
Третий этап установки JRE 8 требует от вас использования Tabи Enterпринятия лицензионного соглашения. Ваша машина остановится на несколько минут во время самой тяжелой части процедуры установки.
Теперь откройте LibreOffice и выберите Сервис -> Параметры -> LibreOffice -> Дополнительно и настройте этот экран:
Нажмите на опции для:
Макрос LibreOffice Writer
Макрос прочитает весь документ и:
Макрос сохранит документ и выйдет из Libreoffice Writer.
Выключить диалог
Сохраните файл, и появится этот диалог:
Выключите это сообщение, как показано на экране. Макрос может работать некорректно, если эта опция включена.
Содержимое макроса
Я потратил несколько дней, пытаясь записать макрос, используя «Инструменты» -> «Макросы» -> «Запись макроса» -> «Основные». Сначала это казалось многообещающим, но записанный макрос имел противоречивое поведение, и его пришлось отказаться от написанного от руки основного макроса. Там есть помощь в Stack Overflow для эксперта, который поможет мне с базовым базовым кодированием . Вот результат:
источник
Вот одноразовый подход с использованием Libre Office. Это не партия, но это может помочь вдохновить другие ответы.
Откройте файл RTF, который имеет шрифт Ubuntu, H1 на 28 пунктов, некоторые текст на 12 пунктов, а некоторые на 18 пунктов.
Вот пример:
Следующие шаги будут применять изменения, запрошенные в вашем вопросе "if font-size: 18px {make it 22px} # Весь текст с размером шрифта 18px теперь равен 22px;"
Нажмите «Правка» → «Найти и заменить» в меню или нажмите « CtrlHДругие параметры». Нажмите «Найти поле», затем кнопку «Атрибуты», установите флажок «Размер шрифта», затем кнопку «Формат», выберите 18 пт из поля прокрутки в правом нижнем углу. поле прокрутки справа
Нажмите Заменить все
применимая строка, которая изменилась, была:
\ par \ pard \ plain \ s0 \ ql \ widctlpar \ hyphpar0 \ ltrpar \ cf1 \ kerning1 \ dbch \ af7 \ langfe1081 \ dbch \ af7 \ afs24 \ alang1081 \ loch \ f3 \ fs24 \ lang1033 \ ql \ widctlpar \ hypp \ hphp {\ rtlch \ ltrch \ loch \ fs36 \ loch \ f6
FS36 изменился на FS44
единственное другое поле, которое изменилось, было полем revtime, которое вы можете или не хотите обновлять:
{\ Revtim \ yr2018 \ mo3 \ dy31 \ hr22 \ min19}
Знание того, что изменилось, дает нам модель для разработки пакетного подхода. Вероятно, можно записать макрос, который делает это при открытии документа, или разработать скрипт, который вносит изменения по желанию.
источник
Есть некоторые отличные подсказки о том, как это можно сделать в спецификации RTF.
Вот мой анализ проблемы.
Достигнуть этого с помощью CLI, как вы предполагаете, может показаться самым простым подходом, поскольку я не видел ни одного приложения на основе графического интерфейса, которое могло бы обрабатывать такого рода пакетное преобразование. Похоже, что вы можете просто изменить заголовок:
Лично после просмотра этой информации мне приходит в голову, что все, что вы пытаетесь сделать, выглядит так, как будто оно поддерживается в заголовке, от выбора шрифта до стиля.
Существуют инструменты, которые помогут вам в этом процессе, и я обрисую их ниже, поскольку у меня нет примера стиля документа, который у вас есть, или стиля документа, который вы хотите, и более общий ответ, вероятно, будет более полезен для сообщества, чем один нацеленный на вашу конкретную ситуацию.
grep
будет полезно проанализировать существующие файлы для конвертации и образец целевого стиля для существующих<fonttbl>
и<stylesheet>
выбранных. Определив, что у вас есть на самом деле, вы сможете написать простой скрипт,sed
который заменит существующее содержимое заголовка желаемым содержимым заголовка. Существует множество примеров того, как перебирать файлы в скрипте bash ( пример ) и как использовать sed ( пример) ), свободно доступный, если вы не знакомы с этими концепциями.Есть также одна строка для замены строки в файле. Некоторые из них могут работать лучше, чем другие, в зависимости от вашего варианта использования. В зависимости от содержания файлов может или не может иметь смысл простой замены каждый экземпляр
fs36
сfs44
какой оболочки используется также может иметь отношение , как лучше писать свои выражения. В зависимости от сложности и содержания документов может быть лучше использоватьsed
,perl
или ,grep
или , возможно , даже их сочетание. Поскольку это стало вопросом программирования, лучше всего направить вас на /programming/15402770/how-to-grep-and-replace где вы легко найдете полдюжины различных подходов, один из который может удовлетворить ваши потребности идеально.Например, если вы хотите применить эти изменения в масштабе всей системы,
find /path/to/files -type f -exec sed -i 's/oldstring/newstring/g' {} \;
как предусмотрено резизтером, вероятно, лучший.Если вы хотите сохранить свои изменения в одном каталоге,
grep -rl matchstring somedir/ | xargs sed -i 's/fs36/fs44/g'
как предусмотрено Билтианом это отличный выбор.Чтобы быть в безопасности, вы должны предварительно обработать файлы, чтобы убедиться, что любые изменения, которые вы можете внести, не будут иметь непредвиденных последствий. Например:
Выше будут отображаться строки, содержащие строку поиска fs36 для каждого файла .rtf в каталоге.
Редактировать:
Самую последнюю спецификацию можно получить здесь. Я не вижу каких-либо изменений, которые должны повлиять на этот подход.
источник
rtf
заголовок и текст,sed
чтобы ответ был централизованнымsed
.