如何在Bash中将cat命令处理XML的多段输出格式化为表格
解决方案
你之前的写法是批量提取所有文件的同一类字段,三个字段的输出是独立的长列表,无法一一对应到同一个元素的属性。只要改成逐个处理每个XML文件,同一文件内提取三个属性拼成一行即可实现对齐的表格输出:
可行脚本示例
# 打印表头,用占位符控制列对齐 printf "%-8s %-8s %s\n" "Symbol" "Number" "Weight" # 遍历所有元素XML文件 for f in elements/*.xml; do # 分别提取当前文件的三个字段值 symbol=$(sed -n 's/.*<symbol>\(.*\)<\/symbol>.*/\1/p' "$f" | tr '|' ' ') num=$(sed -n 's/.*<atomic-number>\(.*\)<\/atomic-number>.*/\1/p' "$f" | tr '|' ' ') weight=$(sed -n 's/.*<atomic-weight>\(.*\)<\/atomic-weight>.*/\1/p' "$f" | tr '|' ' ') # 按对齐格式打印当前元素的一行数据 printf "%-8s %-8s %s\n" "$symbol" "$num" "$weight" done
说明
- 用
printf的%-8s左对齐占位符控制每列宽度为8个字符,自动补空格实现列对齐,效果和你给出的期望输出完全一致 - 如果你习惯用grep,也可以把sed提取的部分换成grep环视写法,比如
grep -oP '(?<=<symbol>).*(?=</symbol>)' "$f",逻辑完全相同 - 所有
tr '|' ' '的逻辑和你原有代码保持一致,保留你原有的替换需求
内容的提问来源于stack exchange,提问作者ibwell
相关产品推荐
相关产品推荐

