如何在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
相关产品推荐
相关产品推荐

