当前位置: 首页 > news >正文

一个能够生成 Markdown 表格的 Bash 脚本

哈喽大家好,我是咸鱼。

今天分享一个很实用的 bash 脚本,可以通过手动提供单元格内容和列数或者将带有分隔符的文件(如 CSV、TSV 文件)转换为 Markdown 表格。

源代码在文末哦!原文链接:https://josh.fail/2022/pure-bash-markdown-table-generator/

具体功能:

  • 手动生成表格:允许用户输入表格内容和列数,生成标准的 Markdown 格式表格。
  • 文件转换:可以将 CSV 或 TSV 文件转换为 Markdown 表格。
  • 选项支持:支持指定列数、设置分隔符、解析 CSV/TSV 文件等选项。

主要选项:

  • -COLUMNS:设置生成表格的列数。
  • -sSEPARATOR:自定义输入文件的列分隔符。
  • --csv--tsv:分别用于解析 CSV 和 TSV 文件。

几个月前,我想要一个便携式的 Markdown 表格生成器,于是写了这个 markdown-table 脚本。

一开始我只是想传入一堆参数和列数,并让它生成相应的 Markdown 表格。就像下面的例子:

markdown-table -4 \"Heading 1"  "Heading 2" "Heading 3" "Heading 4" \"Hi"         "There"     "From"      "Markdown\!" \"Everything" "Is"        "So"        "Nicely Aligned\!"

当我实现了这一功能后,我意识到还可以添加支持解析带有自定义分隔符的文件,比如 CSV 或 TSV。

markdown-table --tsv < test.tsv

上面两种方法都会生成一个 Markdown 表格:

| Heading 1  | Heading 2 | Heading 3 | Heading 4      |
| ---------- | --------- | --------- | -------------- |
| Hi         | There     | From      | Markdown       |
| Everything | Is        | So        | Nicely Aligned |
#!/usr/bin/env bash
# Usage: markdown-table -COLUMNS [CELLS]
#        markdown-table -sSEPARATOR < file
#
# NAME
#   markdown-table -- generate markdown tables
#
# SYNOPSIS
#   markdown-table -COLUMNS [CELLS]
#   markdown-table -sSEPARATOR < file
#
# DESCRIPTION
#   markdown-table helps generate markdown tables. Manually supply arguments
#   and a column count to generate a table, or pass in a delimited file to
#   convert to a table.
#
# OPTIONS
#   -COLUMNS
#       Number of columns to include in output.
#
#   -sSEPARATOR
#       String used to separate columns in input files.
#
#   --csv
#       Shortcut for `-s,` to parse CSV files. Note that this is a "dumb" CSV
#       parser -- it won't work if your cells contain commas!
#
#   --tsv
#       Shortcut for `-s$'\t'` to parse TSV files.
#
#   -h, --help
#       Prints help text and exits.
#
# EXAMPLES
#   Build a 4 column markdown table from arguments:
#     markdown-table -4 \
#       "Heading 1"  "Heading 2" "Heading 3" "Heading 4" \
#       "Hi"         "There"     "From"      "Markdown!" \
#       "Everything" "Is"        "So"        "Nicely Aligned!"
#
#   Convert a CSV file into a markdown table:
#     markdown-table -s, < some.csv
#     markdown-table --csv < some.csv
#
#   Convert a TSV file into a markdown table:
#     markdown-table -s$'\t' < test.tsv
#     markdown-table --tsv < test.tsv# Call this script with DEBUG=1 to add some debugging output
if [[ "$DEBUG" ]]; thenexport PS4='+ [${BASH_SOURCE##*/}:${LINENO}] 'set -x
fiset -e# Echoes given args to STDERR
#
# $@ - args to pass to echo
warn() {echo "$@" >&2
}# Print the help text for this program
#
# $1 - flag used to ask for help ("-h" or "--help")
print_help() {sed -ne '/^#/!q;s/^#$/# /;/^# /s/^# //p' < "$0" |awk -v f="$1" 'f == "-h" && ($1 == "Usage:" || u) {u=1if ($0 == "") {exit} else {print}}f != "-h"'
}# Returns the highest number in the given arguments
#
# $@ - one or more numeric arguments
max() {local max=0 argfor arg; do(( ${arg:-0} > max )) && max="$arg"doneprintf "%s" "$max"
}# Formats a table in markdown format
#
# $1 - field separator string
format_table() {local fs="$1" buffer col current_col=0 current_row=0 min=3local -a lengths=()buffer="$(cat)"# First pass to get column lengthswhile read -r line; docurrent_col=0while read -r col; dolengths["$current_col"]="$(max "${#col}" "${lengths[$current_col]}")"current_col=$((current_col + 1))done <<< "${line//$fs/$'\n'}"done <<< "$buffer"# Second pass writes each rowwhile read -r line; docurrent_col=0current_row=$((current_row + 1))while read -r col; doprintf "| %-$(max "${lengths[$current_col]}" "$min")s " "$col"current_col=$((current_col + 1))done <<< "${line//$fs/$'\n'}"printf "|\n"# If this is the first row, print the header dashesif [[ "$current_row" -eq 1 ]]; thenfor (( current_col=0; current_col < ${#lengths[@]}; current_col++ )); doprintf "| "printf "%$(max "${lengths[$current_col]}" "$min")s" | tr " " -printf " "doneprintf "|\n"fidone <<< "$buffer"
}# Main program
main() {local arg cols i fs="##$$FS##"while [[ $# -gt 0 ]]; docase "$1" in-h | --help) print_help "$1"; return 0 ;;-[0-9]*) cols="${1:1}"; shift ;;-s*) fs="${1:2}"; shift ;;--csv) fs=","; shift ;;--tsv) fs=$'\t'; shift ;;--) shift; break ;;-*) warn "Invalid option '$1'"; return 1 ;;*) break ;;esacdoneif [[ -z "$fs" ]]; thenwarn "Field separator can't be blank!"return 1elif [[ $# -gt 0 ]] && ! [[ "$cols" =~ ^[0-9]+$ ]]; thenwarn "Missing or Invalid column count!"return 1fi{ if [[ $# -gt 0 ]]; thenwhile [[ $# -gt 0 ]]; dofor (( i=0; i < cols; i++ )); doif (( i + 1 == cols )); thenprintf "%s" "$1"elseprintf "%s%s" "$1" "$fs"fishiftdoneprintf "\n"doneelsecatfi} | format_table "$fs"
}main "$@"

http://www.mrgr.cn/news/10216.html

相关文章:

  • C# 自动化抢购脚本:基于商品链接的实现方案
  • DrawDB数据库设计工具本地部署结合内网穿透实现团队异地协作办公
  • docker 里 oneapi 启动失败:failed to get gpt-3.5-turbo token encoder
  • 实时图形识别的实现:模板匹配与几何特征方法的对比
  • 书生大模型实战营(第三期闯关大挑战)- 进阶岛 第五关 茴香豆:企业级知识库问答工具
  • 预约上门服务小程序开发源码搭建流程
  • 【python】如何通过Python中的http.server搭建文件上传下载服务
  • C++第十二弹 -- STL之list模拟实现
  • Windows环境下,使用bat脚本配置本地域名解析(含新增、修改、清理)
  • 飞速(FS)400G SR4光模块概述
  • day5JS-String常用方法和Math常用方法
  • FTP服务器(服务名vsftpd,端口tcp/20和tcp/21)
  • 网络安全概述
  • Python爬虫框架Scrapy应用实战解析
  • C++11特性-智能指针
  • K8S集群中驱逐节点
  • C 06 编译4阶段
  • TCP/IP和SNMP
  • 图了个图 - 目前最满意的AI修图软件
  • Windows环境如何安装maven并配置IDEA