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

终端可运行的Bash脚本作为文件执行时终止异常求助

问题:Bash脚本处理大文本时停滞无法结束

停滞原因

  1. 大文本变量的字符串替换效率极低:你将整本《哈利·波特与魔法石》的内容读入Bash变量harry1,随后用${harry1//wand/butt}这类参数展开做替换。Bash对超大字符串的内存处理和替换操作性能极差,会占用大量CPU和内存,导致脚本长时间无响应,看起来像是停滞。
  2. 终端输出大文本的瓶颈:即便替换完成,echo "$harry1_butt"将几十万字的内容直接输出到终端时,终端的渲染速度远跟不上输出速度,也会造成脚本“卡住”的假象。

解决方法

避免将大文本存入Bash变量,改用管道流+文本处理工具直接处理文件,全程流式操作,不加载完整文本到内存:

修改后的脚本

#!/bin/bash

# 清理历史输出文件(可选,避免重复执行时的内容干扰)
rm -f output_file.txt final_output.txt

# 爬取目标文本,curl会自动创建output_file.txt,无需提前touch
curl 'https://archive.org/stream/joannek.rowlingharrypotterbook1harrypotterandthephilosophersstoneenglishonlineclub.com/Joanne%20K.%20Rowling%20%28Harry%20Potter%2C%20Book%201%29%20-%20Harry%20Potter%20and%20the%20Philosophers%20Stone%20%5BEnglishOnlineClub.com%5D_djvu.txt' -o "output_file.txt"

# 解析+清理标签+替换关键词,全程用管道串联,流式处理
tr "\n" "|" < output_file.txt \
  | grep -o '<pre>.*</pre>' \
  | sed 's/\(<pre>\|<\/pre>//g;s/|/\n/g' \
  | sed 's/<[^>]*>//g' \
  | sed -e 's/wand/butt/g' -e 's/buttering/wandering/g' \
  > final_output.txt

# 用分页工具查看结果,避免终端渲染卡顿
less final_output.txt

# 若需直接输出到终端,也可使用cat,但建议优先用less
# cat final_output.txt

优化说明

  • 去掉了冗余的touch output_file.txt,curl的-o参数会自动创建目标文件。
  • 用管道串联所有处理步骤,每个工具仅处理当前流的部分内容,无需加载完整文本到内存,性能大幅提升。
  • 将多次sed操作合并,减少进程启动开销,同时保持逻辑清晰。
  • 用less代替echo输出结果,既避免终端渲染卡顿,又支持分页浏览大文本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:25:20