You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash脚本中按4个换行符分割文件中的文本?

按4个换行符分割文本生成多文件的Bash方案

问题描述

需要在Bash脚本里把文本文件按连续4个换行符分割,最终得到3个对应内容的文件。试过cut命令但没用,因为cut不支持多换行符作为分隔符,想知道能不能用循环实现。

示例输入文件内容:

blabla
blabla




blabla
blabla
blabla
blabla




blabla
blabla
blabla
blabla
blabla

为什么cut不行?

cut只能用单个字符当分隔符,没法识别连续4个换行符这种多字符分隔符,所以你用cat file.cut | cut -d$'\n\n\n\n' -f1这种写法根本不生效。


解决方案

方法1:用awk快速实现(最推荐)

awk支持自定义多字符的记录分隔符,一行命令就能搞定:

awk -v RS='\n\n\n\n' 'NR>0 {print > "output_" NR ".txt"}' file.cut

执行后会生成output_1.txt、output_2.txt、output_3.txt三个文件,分别对应分割后的三段内容。

方法2:用tr+split组合

先把4个换行符替换成一个文本里不会出现的特殊字符(比如空字符\0),再用split分割:

tr '\n\n\n\n' '\0' < file.cut | split -d -z -n l/3 - output_

生成的文件是output_00、output_01、output_02,如果需要调整后缀格式可以修改参数。

方法3:用循环手动处理

如果一定要用循环逐行处理,可以这么写脚本:

#!/bin/bash
empty_line_count=0
file_index=1
current_content=""

while IFS= read -r line; do
    if [[ -z "$line" ]]; then
        ((empty_line_count++))
        # 遇到4个连续空行时输出文件
        if [[ $empty_line_count -eq 4 ]]; then
            echo "$current_content" > "output_${file_index}.txt"
            current_content=""
            empty_line_count=0
            ((file_index++))
        fi
    else
        # 非空行,重置空行计数并追加内容
        empty_line_count=0
        current_content+="$line"$'\n'
    fi
done < file.cut

# 处理最后一段没触发4空行的内容
if [[ -n "$current_content" ]]; then
    echo "$current_content" > "output_${file_index}.txt"
fi

把这段代码存成split_text.sh,给执行权限后运行./split_text.sh就能生成目标文件。


内容的提问来源于stack exchange,提问作者soosius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:50:21