假设我有一个目录,其中包含.rtf
我使用 LibreOffice Writer 编辑的大约 100 个文件。
我希望该目录中的所有文件都具有完全相同的基本富文本样式指令,例如:
* 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 工具而不是命令行
当你只有命令行工具时,一切看起来都像是一个命令行问题。我决定使用 LibreOffice 宏来写这个答案:
.rtf
(富文本格式)Writer 文档文件。创建测试数据
创建两个或多个文件,其中包含:
创建包含以下内容的脚本
~/Downloads/copy-rtf.sh
:使用标记为可执行文件
*.rtf
文件的宏将针对~/Downloads
目录运行。cd ~/Downloads
和运行之前./copy-rtf.sh
使用该
Downloads
目录是因为:~/Downloads
/tmp/
它比在重新启动后可能不会持续存在的目录更永久。在无头环境中运行宏
使用这个Stack Exchange answer,从命令行运行 Libreoffice Writer 并传递一个全局宏名称来执行:
如果上述方法不起作用,可以尝试另一种方法:
安装 Java 运行时环境
要运行宏,您需要安装 Java 运行时环境 (JRE)。开发者的网页上有手动下载和安装的说明。
然而,这个 AU 问答:https ://askubuntu.com/a/728153/307523表明它很简单:
我尝试了 AU Q&A 方法,在添加 PPA 的第一步之后,会出现一个带有附加信息的初始屏幕。最有用的是在 Debian 系统上设置 JRE 8的链接。
安装 JRE 8 的第三步要求您使用Tab并Enter接受许可协议。在安装程序最繁重的部分,您的机器将暂停几分钟。
现在打开 LibreOffice 并选择工具->选项-> LibreOffice ->高级并设置此屏幕:
单击以下选项:
LibreOffice Writer 宏
该宏将通读整个文档并:
该宏将保存文档并退出 LibreOffice Writer。
关闭对话框
保存文件并出现此对话框:
关闭此消息,如屏幕所示。如果启用此选项,宏可能无法正常运行。
宏内容
我花了几天时间尝试使用“工具”->“宏”->“录制宏”->“基本”来录制宏。起初它看起来很有希望,但录制的宏有不一致的行为,不得不放弃手写的基本宏。在 Stack Overflow 中为那里的专家找到了帮助,以帮助我进行基本的基本编码。结果如下:
这是使用 Libre Office 的一次性方法。这不是批处理,但它可能有助于激发其他答案。
打开具有 Ubuntu 字体的 rtf 文件,H1 为 28 pt,一些文本为 12 pt,一些文本为 18 pt。
这是一个例子:
以下步骤将应用您的问题“if font-size: 18px {make it 22px} # All text with font-size 18px is now 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\hyppar0\ltrpar {\rtlch \ltrch\loch\fs36\loch\f6
fs36 改为 fs44
唯一更改的其他字段是您可能想要或不想更新的 revtime 字段:
{\revtim\yr2018\mo3\dy31\hr22\min19}
了解发生了什么变化为我们提供了开发批处理方法的模型。可能会在打开文档时录制一个执行此操作的宏,或者开发一个根据需要进行更改的脚本。
在RTF 规范中有一些很好的线索来说明如何处理这个问题。
以下是我对这个问题的分析。
正如您所猜测的那样,使用 CLI 完成此操作似乎是最简单的方法,因为我还没有看到任何基于 GUI 的应用程序可以处理这种批量转换。看来您可以简单地修改标题:
就个人而言,在查看此信息后,我发现您尝试做的所有事情看起来都在标题中得到支持,从字体选择到样式。
有一些工具可以帮助您完成此过程,我将在下面概述,因为我没有您拥有的文档样式的示例,也没有您想要的文档样式的示例,并且更通用的答案可能比社区更有用一个针对您的确切情况。
grep
将有助于解析要转换的现有文件以及现有<fonttbl>
和<stylesheet>
选择的目标样式示例。在确定了您实际拥有的内容后,您应该能够编写一个简单的脚本sed
,用于将现有的标题内容替换为所需的标题内容。如果您不熟悉这些概念,有许多示例说明如何在 bash 脚本中迭代文件(示例)以及如何免费使用 sed(示例)。还有一行选项可以替换文件中的字符串。根据您的用例,有些可能比其他更好。根据您文件的内容,简单地用您使用的哪个 shell 替换每个实例可能有意义,也可能没有意义,
fs36
这fs44
也可能与如何最好地编写您的表达式有关。根据文档的复杂性和内容,您可能最好使用sed
,perl
或者grep
甚至是它们的组合。由于这已成为一个编程问题,最好将您推荐给https://stackoverflow.com/questions/15402770/how-to-grep-and-replace,您可以轻松找到 1/2 打不同的方法,其中之一这很可能完全适合您的需求。例如,如果您希望在系统范围内应用这些更改,
find /path/to/files -type f -exec sed -i 's/oldstring/newstring/g' {} \;
rezizter提供的可能是最好的。如果您希望将更改包含在单个目录中,
grep -rl matchstring somedir/ | xargs sed -i 's/fs36/fs44/g'
由billtian提供是一个很好的选择。为了安全起见,您应该对文件进行预处理,以确保您所做的任何更改都不会产生意外后果。例如:
上面将显示包含目录中每个 .rtf 文件的搜索字符串 fs36 的行。
编辑:
最新的规范可以在这里获得。我没有看到任何会影响这种方法的变化。