Powiedzmy, że mam katalog z około 100 .rtf
plikami, które edytuję za pomocą LibreOffice Writer.
Chciałbym, aby wszystkie pliki w tym katalogu miały dokładnie takie same podstawowe wytyczne dotyczące stylów tekstu sformatowanego, na przykład:
* 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;
I tak dalej ... Zasadniczo chcę zmienić wszystkie pliki jednocześnie. Czy taka „stylizacja” jest możliwa?
Może jest to możliwe dzięki CLI?
libreoffice
style
JohnDoea
źródło
źródło
Odpowiedzi:
Użyj narzędzi Libreoffice zamiast CLI
Gdy wszystko, co masz, to narzędzia wiersza polecenia, wszystko wygląda jak problem z wierszem poleceń. Postanowiłem napisać tę odpowiedź za pomocą makr LibreOffice:
.rtf
plik dokumentu Writer (Rich Text Format).Utwórz dane testowe
Utwórz dwa lub więcej plików zawierających:
Utwórz skrypt
~/Downloads/copy-rtf.sh
zawierający:Oznacz jako wykonywalny za pomocą
*.rtf
pliki modyfikujące makra będą działały w~/Downloads
katalogu.cd ~/Downloads
i uruchom./copy-rtf.sh
Katalog Pobrane jest używany, ponieważ:
~/Downloads
/tmp/
katalog, który może nie utrzymywać się po ponownym uruchomieniu.Uruchom makro w środowisku bezgłowym
Korzystając z odpowiedzi Stack Exchange, wywołaj Libreoffice Writer z wiersza poleceń i przekaż mu globalną nazwę makra, aby wykonać:
Powyższa odpowiedź może nie działać, więc można wypróbować inną metodę :
Zainstaluj środowisko Java Runtime Environment
Aby uruchomić makra, musisz zainstalować środowisko Java Runtime Environment (JRE). Strona internetowa programisty zawiera instrukcje dotyczące ręcznego pobierania i instalowania.
Jednak te pytania i odpowiedzi dotyczące AU: /ubuntu//a/728153/307523 sugerują, że jest to tak proste, jak:
Wypróbowałem metodę AU Q&A i po pierwszym kroku dodawania PPA pojawia się ekran powitalny z dodatkowymi informacjami. Najbardziej pomocny jest link do konfiguracji JRE 8 w systemach Debian .
Trzeci krok instalacji środowiska JRE 8 wymaga użycia Tabi Enterzaakceptowania umowy licencyjnej. Podczas najcięższej części procedury instalacji urządzenie zatrzyma się na kilka minut.
Teraz otwórz LibreOffice i wybierz Narzędzia -> Opcje -> LibreOffice -> Zaawansowane i skonfiguruj ten ekran:
Kliknij opcje dla:
LibreOffice Writer Macro
Makro przeczyta cały dokument i:
Makro zapisze dokument i zamknie Libreoffice Writer.
Wyłącz okno dialogowe
Wykonaj zapis pliku, a pojawi się następujące okno dialogowe:
Wyłącz tę wiadomość, jak pokazuje na ekranie. Makro może nie działać poprawnie, jeśli ta opcja jest włączona.
Zawartość makr
Spędziłem kilka dni próbując nagrać makro za pomocą „Narzędzia” -> „Makra” -> „Nagraj makro” -> „Podstawowy”. Na początku wydawało się to obiecujące, ale zarejestrowane makro nie zachowywało się niekonsekwentnie i musiało zostać porzucone, aby napisać ręcznie makro podstawowe. Znaleziona pomoc w przepełnieniu stosu dla eksperta, który pomoże mi w podstawowym podstawowym kodowaniu . Oto wynik:
źródło
Oto jednorazowe podejście z użyciem Libre Office. To nie jest partia, ale może zainspirować inne odpowiedzi.
Otwórz plik RTF z czcionką Ubuntu, H1 przy 28 pt, trochę tekstu przy 12pt, a niektóre przy 18 pt.
Oto przykład:
W poniższych krokach zastosowana zostanie zmiana wymagana w pytaniu „if-font: size: 18px {make it 22px} # Cały tekst o rozmiarze czcionki 18px ma teraz 22px;”
Kliknij Edycja → Znajdź i zamień w menu lub wciśnij CtrlHInne opcje Kliknij Wyszukaj pole, a następnie przycisk atrybuty Pole wyboru Rozmiar czcionki, a następnie przycisk Formatuj wybierz 18 pkt z pola przewijania po prawej stronie Kliknij Zamień na pole, a następnie przycisk Formatuj i wybierz 22 pkt z pole przewijania po prawej stronie
Kliknij Zamień wszystko
obowiązująca zmieniona linia to:
\ 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
fs36 zmieniono na fs44
jedynym innym polem, które się zmieniło, było pole revtime, które możesz lub nie chcesz aktualizować:
{\ revtim \ yr2018 \ mo3 \ dy31 \ hr22 \ min19}
Wiedza o tym, co się zmieniło, daje nam model do opracowania podejścia wsadowego. Prawdopodobnie możliwe jest zarejestrowanie makra, które robi to po otwarciu dokumentu lub opracowanie skryptu, który wprowadza zmiany zgodnie z potrzebami.
źródło
Istnieje kilka świetnych wskazówek, jak można to zrobić w specyfikacji RTF.
Oto moja analiza problemu.
Osiągnięcie tego przy użyciu interfejsu CLI, jak się domyślacie, wydaje się być najprostszym podejściem, ponieważ nie widziałem żadnych aplikacji opartych na GUI, które mogłyby obsługiwać tego rodzaju konwersję wsadową. Wygląda na to, że możesz po prostu zmodyfikować nagłówek:
Osobiście po przejrzeniu tych informacji przychodzi mi do głowy, że wszystko, co próbujesz zrobić, wygląda tak, jakby było obsługiwane w nagłówku, od wyboru czcionki do stylu.
Dostępne są narzędzia, które pomogą ci w tym procesie, które opiszę poniżej, ponieważ nie mam przykładowego stylu dokumentu ani stylu dokumentu, którego chciałbyś, a bardziej ogólna odpowiedź będzie prawdopodobnie bardziej przydatna dla społeczności niż jeden ukierunkowany na twoją dokładną sytuację.
grep
przyda się do przeanalizowania istniejących plików do konwersji i próbki stylu docelowego dla istniejących<fonttbl>
i<stylesheet>
selekcji. Po ustaleniu, co faktycznie masz, powinieneś być w stanie napisać prosty skrypt wykorzystującysed
do zastąpienia istniejącej zawartości nagłówka żądaną zawartością nagłówka. Istnieje wiele przykładów, jak iterować pliki w skrypcie bash ( przykład ) i jak korzystać z sed ( przykład ) swobodnie dostępnego, jeśli nie znasz tych pojęć.Istnieje również jedna opcja wiersza zastępująca ciąg w pliku. Niektóre mogą działać lepiej niż inne w zależności od przypadku użycia. W zależności od zawartości plików może lub nie może mieć sens prostych zastąpić każde wystąpienie
fs36
zfs44
których powłoka używasz może również mieć wpływ na jak najlepiej napisać wyrażeń. W zależności od stopnia złożoności i zawartości dokumentów może być lepiej wyłączyć za pomocąsed
,perl
lubgrep
czy może nawet ich kombinacją. Ponieważ stało się to pytaniem programistycznym, najlepiej odnieść cię do /programming/15402770/how-to-grep-and-replace, gdzie łatwo znajdziesz 1/2 tuzina różnych podejść, jedno z który prawdopodobnie idealnie spełni twoje potrzeby.Na przykład, jeśli chcesz zastosować te zmiany w całym systemie,
find /path/to/files -type f -exec sed -i 's/oldstring/newstring/g' {} \;
jak zapewnia rezizter Jest prawdopodobnie najlepszy.Jeśli chcesz zawrzeć swoje zmiany w jednym katalogu,
grep -rl matchstring somedir/ | xargs sed -i 's/fs36/fs44/g'
jak zapewnia billtian jest doskonałym wyborem.Aby zachować bezpieczeństwo, należy wstępnie przetworzyć pliki, aby upewnić się, że wszelkie wprowadzone zmiany nie będą miały niezamierzonych konsekwencji. Na przykład:
Powyżej wyświetli wiersze zawierające szukany ciąg fs36 dla każdego pliku .rtf w katalogu.
Edytować:
Najnowszą specyfikację można uzyskać tutaj. Nie widzę żadnych zmian, które powinny wpłynąć na to podejście.
źródło
rtf
nagłówek i tekst,sed
aby odpowiedź była scentralizowanased
.