如何编写Bash脚本,用Sed截取HTML/HTM内容生成临时文件?
解决Bash脚本处理HTML文件的需求
没问题,我来帮你完善这个Bash脚本,完全满足你的递归查找、内容裁剪和临时文件保存的需求!
完整可运行脚本
#!/bin/bash # 替换为你的目标目录路径(比如./my-html-files) TARGET_DIR="/path/to/your/target/directory" # 递归查找所有.html/.htm文件,兼容带空格/特殊字符的文件名 find "$TARGET_DIR" -type f \( -name "*.html" -o -name "*.htm" \) -print0 | while IFS= read -r -d '' file; do # 生成临时文件名:原文件名+'-temp'后缀(比如index.html → index-temp.html) temp_file="${file%.*}-temp.${file##*.}" # 检查文件是否同时包含<body>和</body>标签,避免生成空文件 if grep -q "<body>" "$file" && grep -q "</body>" "$file"; then # 使用sed完成内容裁剪: # 1. 删除<body>标签及其之前的所有行 # 2. 删除</body>标签及其之后的所有行 sed '1,/<body>/d; /<\/body>/,$d' "$file" > "$temp_file" echo "✅ 处理完成:$file → $temp_file" else echo "⚠️ 跳过文件(缺少<body>或</body>标签):$file" fi done
关键部分详解
1. 递归查找文件
find "$TARGET_DIR" -type f \( -name "*.html" -o -name "*.htm" \):精准匹配目标目录下所有.html和.htm格式的文件-print0+while IFS= read -r -d '' file:完美处理文件名包含空格、特殊字符的场景,避免脚本出错
2. 临时文件名生成
${file%.*}-temp.${file##*.}是Bash的参数扩展技巧:
${file%.*}:去掉文件名的后缀部分(比如/home/page.html→/home/page)${file##*.}:获取文件名的后缀(比如/home/page.html→html)- 最终生成的临时文件和原文件同目录、同后缀,仅在文件名中间加
-temp
3. Sed内容裁剪逻辑
sed '1,/<body>/d; /<\/body>/,$d':
1,/<body>/d:删除从第1行到第一个匹配<body>的行(包括<body>所在行)/<\/body>/,$d:删除从第一个匹配</body>的行到文件末尾(包括</body>所在行)- 如果需要精确匹配纯
<body>标签(不含属性),可以把正则改成/^<body>$/和/^<\/body>$/(^表示行首,$表示行尾)
4. 健壮性优化
添加grep -q检查:确保只有同时包含<body>和</body>的文件才会被处理,避免生成空的临时文件
使用方法
- 将脚本保存为
process-html.sh - 修改
TARGET_DIR为你要处理的目录路径 - 赋予执行权限:
chmod +x process-html.sh - 运行脚本:
./process-html.sh
内容的提问来源于stack exchange,提问作者ItInNeed
相关产品推荐
相关产品推荐

