求Shell脚本:将大HTML表格转为单引号包裹的竖线分隔文本
处理HTML表格转指定格式的Shell脚本
方案一:用pup+jq(推荐,兼容复杂HTML结构)
这两个是专门的命令行HTML/JSON解析工具,处理HTML比正则更可靠,适合大文件和复杂表格结构。
- 先安装工具(以Debian/Ubuntu为例):
sudo apt install pup jq
- 编写脚本(比如命名为
html2table.sh):
#!/bin/bash # 传入HTML文件路径作为参数,无参数则读取标准输入 INPUT_FILE="${1:-/dev/stdin}" # 提取表格数据并转换为目标格式 pup 'table tr json{}' "$INPUT_FILE" | jq -r ' .[] | .children | map(.text | gsub("'\''"; "\\\\'\\''")) # 转义内容中的单引号,避免格式冲突 | "|\'" + join("|\'") + "\'" '
- 使用方式:
# 处理单个文件并输出到文本 ./html2table.sh input.html > output.txt # 通过管道输入处理 cat input.html | ./html2table.sh > output.txt
脚本会自动识别表格列数,处理内容中的单引号转义,输出完全符合要求的格式。
方案二:用sed+awk(无需额外工具,适合规整HTML)
如果无法安装外部工具,且HTML格式规整(<td>标签单独一行、内容无跨行),可以用这个方案:
- 编写脚本:
#!/bin/bash INPUT_FILE="${1:-/dev/stdin}" # 提取<td>内文本并按行分组转换 sed -n 's/.*<td[^>]*>\(.*\)<\/td>.*/\1/p' "$INPUT_FILE" | awk ' BEGIN { # 自动统计表格列数 col_count=0 while ((getline line < "'"$INPUT_FILE"'") > 0) { if (line ~ /<tr>/) { while ((getline td_line < "'"$INPUT_FILE"'") > 0) { if (td_line ~ /<\/tr>/) break if (td_line ~ /<td/) col_count++ } close("'"$INPUT_FILE"'") break } } current_col=0 } { # 转义单引号 gsub(/'\''/, "\\'\\''", $0) if (current_col == 0) { printf "|\047%s\047", $0 } else { printf "|\047%s\047", $0 } current_col = (current_col + 1) % col_count if (current_col == 0) print "" } END { if (current_col != 0) print "" } '
- 使用方式和方案一一致。
注意:该方案依赖HTML结构规整,若<td>内容跨行或标签嵌套,可能提取错误,优先推荐方案一。
内容的提问来源于stack exchange,提问作者Sooraj P George
相关产品推荐
相关产品推荐

