如何按日期行拆分RTF文件为对应日期命名的独立文档?
完全可以通过bash脚本实现你的RTF拆分需求
这种实现方式不需要依赖复杂的图形化工具,完全适配你提到的「每个日期块内容量不固定、文档存在前导空格/空行」的场景,不会像固定行数的split命令那样出现内容错分的问题。
核心实现逻辑
针对你的文档格式,脚本会按照以下规则完成拆分:
- 以「带RTF加粗标记的
YYYY-M-D格式日期行」作为唯一拆分边界 - 自动忽略行首的前导空格、零散空行,不会因为格式杂讯误判拆分点
- 拆分生成的每个独立RTF文件,会自动补上原文档的公共格式头部、末尾闭合标记,保证打开后和原文档内对应块的样式(加粗、超链接、文本格式)完全一致,不会出现乱码
可直接复用的新手友好脚本
将以下内容保存为同目录下的split_rtf.sh文件,脚本内加了逐行注释,不需要你掌握复杂语法也能直接用:
#!/bin/bash # 接收用户输入的原RTF文件路径 INPUT_FILE=$1 # 提前提取原文档中、第一个日期行之前的所有公共RTF格式头 HEAD_CONTENT=$(awk '/\\b.*[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}/{exit} {print}' "$INPUT_FILE") # 逐行遍历原文档 while IFS= read -r line; do # 预处理:去掉行首所有前导空格,方便匹配 trimmed_line=$(echo "$line" | sed 's/^[[:space:]]*//') # 匹配带加粗标记的日期行:如果匹配到,就切换输出文件 if echo "$trimmed_line" | grep -qE '\\b.*[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}|[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}.*\\b'; then # 提取行内的日期串作为文件名 new_date=$(echo "$trimmed_line" | grep -oE '[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}') # 如果已经在写之前的文件,先给旧文件补RTF闭合标记 if [ -n "$current_date" ]; then echo "}" >> "$current_date.rtf" fi # 更新当前的写入目标为新的日期 current_date=$new_date # 新建对应日期的输出文件,先写入公共格式头 echo "$HEAD_CONTENT" > "$current_date.rtf" fi # 如果当前已经定位到了某个日期块,就把原行内容追加到对应文件(保留原格式标记) if [ -n "$current_date" ]; then echo "$line" >> "$current_date.rtf" fi done < "$INPUT_FILE" # 给最后一个拆分的文件补上RTF闭合标记,保证所有文件可正常打开 if [ -n "$current_date" ]; then echo "}" >> "$current_date.rtf" fi
新手操作步骤
- 先给脚本加可执行权限:在终端输入
chmod +x split_rtf.sh - 运行脚本,把你的原RTF文件名作为参数传入:比如原文件叫
notes.rtf,就输入./split_rtf.sh notes.rtf - 运行完成后,当前目录下就会自动生成和每个日期对应的独立RTF文件,和你举例的「2020-11-15.rtf、2020-11-11.rtf」的预期效果完全一致。
注意事项
- 第一次运行前建议备份原文档,避免操作失误导致内容丢失
- 如果你的文档里日期分隔符是
/而不是-,可以把脚本里正则匹配部分的-改成/,即可适配 - 脚本会自动跳过原文档最开头没有归属到任何日期的零散空行、格式杂讯,不会生成无效的拆分文件
内容的提问来源于stack exchange,提问作者Elmer Scott
相关产品推荐
相关产品推荐

