Katakanlah saya memiliki direktori dengan sekitar 100 .rtf
file yang saya edit dengan LibreOffice Writer.
Saya berharap bahwa semua file dalam direktori itu akan memiliki arahan penataan gaya teks kaya persis sama, misalnya:
* 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;
Dan sebagainya ... Jadi, pada dasarnya saya ingin mengubah semua file sekaligus. Mungkinkah "penataan massal" seperti itu?
Mungkin itu mungkin dengan CLI entah bagaimana?
libreoffice
style
JohnDoea
sumber
sumber
Jawaban:
Gunakan alat Libreoffice bukan CLI
Ketika semua yang Anda miliki adalah alat baris perintah semuanya tampak seperti masalah baris perintah. Saya telah memutuskan untuk menulis jawaban ini menggunakan makro LibreOffice:
.rtf
(Rich Text Format) file dokumen Writer.Buat data uji
Buat dua atau lebih file yang mengandung:
Buat skrip yang
~/Downloads/copy-rtf.sh
berisi:Tandai sebagai dapat dieksekusi menggunakan
*.rtf
file akan berjalan melawan~/Downloads
direktori.cd ~/Downloads
dan jalankan./copy-rtf.sh
Direktori Unduhan digunakan karena:
~/Downloads
/tmp/
direktori yang mungkin tidak bertahan selama reboot.Jalankan makro di lingkungan tanpa kepala
Menggunakan jawaban Stack Exchange ini, minta Libreoffice Writer dari baris perintah dan berikan nama makro global untuk dieksekusi:
Jawaban di atas mungkin tidak berfungsi sehingga metode lain dapat dicoba:
Instal Java Runtime Environment
Untuk menjalankan makro Anda perlu menginstal Java Runtime Environment (JRE). Halaman web pengembang memiliki instruksi untuk mengunduh dan menginstal secara manual.
Namun, T&J AU ini: /ubuntu//a/728153/307523 menyarankannya sesederhana:
Saya mencoba metode Tanya Jawab AU dan setelah langkah pertama menambahkan PPA, layar splash muncul dengan informasi tambahan. Yang paling membantu adalah tautan untuk mengatur JRE 8 pada sistem Debian .
Langkah ketiga menginstal JRE 8 mengharuskan Anda untuk menggunakan Tabdan Entermenerima Perjanjian Lisensi. Mesin Anda akan berhenti selama beberapa menit selama bagian terberat dari rutin instalasi.
Sekarang buka LibreOffice dan pilih Alat -> Opsi -> LibreOffice -> Advanced dan setup layar ini:
Klik opsi untuk:
LibreOffice Writer Macro
Makro akan membaca seluruh dokumen dan:
Makro akan menyimpan dokumen dan keluar dari Libreoffice Writer.
Matikan Dialog
Lakukan penyimpanan file dan dialog ini muncul:
Matikan pesan ini seperti yang ditampilkan di layar. Makro mungkin tidak berjalan dengan benar jika opsi ini aktif.
Konten makro
Saya menghabiskan beberapa hari mencoba merekam makro menggunakan "Alat" -> "Makro" -> "Rekam Makro" -> "Dasar". Pada awalnya itu tampak menjanjikan tetapi makro yang direkam memiliki perilaku yang tidak konsisten dan harus ditinggalkan untuk makro dasar tulisan tangan. Ditemukan bantuan di Stack Overflow untuk ahli di sana untuk membantu saya dengan pengkodean dasar dasar . Inilah hasilnya:
sumber
Berikut ini pendekatan sekali pakai menggunakan Libre Office. Ini bukan batch, tetapi dapat membantu menginspirasi jawaban lain.
Buka file rtf yang memiliki font Ubuntu, H1 pada 28 pt, beberapa teks pada 12pt dan beberapa pada 18 pt.
Ini sebuah contoh:
Langkah-langkah berikut akan menerapkan perubahan yang diminta dalam pertanyaan Anda "jika ukuran font: 18px {make it 22px} # Semua teks dengan ukuran font 18px sekarang 22px;"
Klik Edit → Cari & Ganti pada menu atau tekan CtrlHOpsi lain. Klik kotak Cari Untuk kemudian tombol atribut Ukuran font kotak centang lalu Format tombol pilih 18 pt dari kotak gulir di sebelah kanan. Klik Ganti dengan kotak lalu Format tombol dan pilih 22 pt dari kotak gulir di paling kanan
Klik Ganti Semua
baris yang berlaku yang berubah adalah:
\ par \ pard \ plain \ s0 \ ql \ widctlpar \ hyphpar0 \ ltrpar \ cf1 \ kerning1 \ dbch \ af7 \ langfe1081 \ dbch \ af7 \ afs24 \ alang1081 \ loch \ f3 \ fs24 \ lang1033 \ ql \ widctlpar \ lhpar \ {\ rtlch \ ltrch \ loch \ fs36 \ loch \ f6
fs36 berubah menjadi fs44
satu-satunya bidang lain yang berubah adalah bidang revtime yang Anda mungkin atau mungkin tidak ingin memperbarui:
{\ revtim \ yr2018 \ mo3 \ dy31 \ hr22 \ min19}
Mengetahui apa yang berubah memberi kita model untuk mengembangkan pendekatan batch. Mungkin saja untuk Merekam Makro yang melakukan ini saat membuka dokumen atau mengembangkan skrip yang membuat perubahan seperti yang diinginkan.
sumber
Ada beberapa petunjuk hebat tentang bagaimana seseorang dapat melakukan ini dalam spesifikasi RTF.
Inilah analisis saya tentang masalah ini.
Menyelesaikan ini menggunakan CLI saat Anda menduga akan menjadi pendekatan yang paling sederhana karena saya belum melihat aplikasi berbasis GUI yang dapat menangani konversi batch semacam ini. Tampaknya Anda dapat dengan mudah memodifikasi tajuk:
Secara pribadi, setelah meninjau informasi ini, saya menyadari bahwa semua yang Anda coba lakukan sepertinya didukung di header, dari pemilihan font hingga gaya.
Ada alat yang tersedia untuk membantu Anda dengan proses ini yang akan saya uraikan di bawah karena saya tidak memiliki contoh gaya dokumen yang Anda miliki atau gaya dokumen yang Anda inginkan dan jawaban yang lebih umum kemungkinan akan lebih berguna untuk komunitas daripada satu ditargetkan untuk situasi Anda yang sebenarnya.
grep
akan berguna untuk mem-parsing file yang ada untuk dikonversi dan sampel gaya target untuk yang sudah ada<fonttbl>
dan<stylesheet>
pilihan. Setelah menentukan apa yang sebenarnya Anda miliki, Anda harus dapat menulis skrip sederhana dengan memanfaatkansed
untuk mengganti konten header yang ada dengan konten header yang diinginkan. Ada banyak contoh tentang bagaimana melakukan iterasi melalui file dalam skrip bash ( contoh ) dan cara memanfaatkan sed ( contoh ) yang tersedia secara bebas jika Anda tidak terbiasa dengan konsep-konsep ini.Ada juga satu opsi baris untuk mengganti string dalam file. Beberapa mungkin bekerja lebih baik daripada yang lain tergantung pada kasus penggunaan Anda. Bergantung pada konten file Anda, mungkin atau mungkin tidak masuk akal untuk mengganti setiap instance
fs36
denganfs44
shell mana yang Anda gunakan mungkin juga berhubungan dengan cara terbaik untuk menulis ekspresi Anda. Bergantung pada kerumitan dan isi dokumen Anda, Anda mungkin lebih baik menggunakansed
,perl
ataugrep
atau bahkan kombinasi dari mereka. Karena ini telah menjadi pertanyaan pemrograman, sebaiknya merujuk Anda ke /programming/15402770/how-to-grep-and-replace mana Anda akan dengan mudah menemukan 1/2 lusin pendekatan yang berbeda, salah satunya yang mungkin sesuai dengan kebutuhan Anda dengan sempurna.Misalnya, jika Anda ingin menerapkan perubahan sistem ini secara luas,
find /path/to/files -type f -exec sed -i 's/oldstring/newstring/g' {} \;
seperti yang disediakan oleh rezizter Kemungkinan adalah yang terbaik.Jika Anda ingin memuat perubahan Anda ke satu direktori,
grep -rl matchstring somedir/ | xargs sed -i 's/fs36/fs44/g'
seperti yang disediakan oleh billtian adalah pilihan yang sangat baik.Agar aman, Anda harus memproses ulang file untuk memastikan bahwa setiap perubahan yang Anda buat tidak akan memiliki konsekuensi yang tidak diinginkan. Contohnya:
Di atas akan menampilkan baris yang berisi string pencarian fs36 untuk setiap file .rtf di direktori.
Edit:
Spesifikasi terbaru dapat diperoleh di sini. Saya tidak melihat perubahan apa pun yang berdampak pada pendekatan ini.
sumber
rtf
dengan tajuk dan tekssed
sehingga jawaban akan terpusat padased
.