翼度科技»论坛 云主机 LINUX 查看内容

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

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
哈喽大家好,我是咸鱼。
今天分享一个很实用的 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 表格。就像下面的例子:
  1. markdown-table -4 \
  2. "Heading 1"  "Heading 2" "Heading 3" "Heading 4" \
  3. "Hi"         "There"     "From"      "Markdown\!" \
  4. "Everything" "Is"        "So"        "Nicely Aligned\!"
复制代码
当我实现了这一功能后,我意识到还可以添加支持解析带有自定义分隔符的文件,比如 CSV 或 TSV。
  1. markdown-table --tsv < test.tsv
复制代码
上面两种方法都会生成一个 Markdown 表格:
  1. | Heading 1  | Heading 2 | Heading 3 | Heading 4      |
  2. | ---------- | --------- | --------- | -------------- |
  3. | Hi         | There     | From      | Markdown       |
  4. | Everything | Is        | So        | Nicely Aligned |
复制代码
[code]#!/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 outputif [[ "$DEBUG" ]]; then  export PS4='+ [${BASH_SOURCE##*/}:${LINENO}] '  set -xfiset -e# Echoes given args to STDERR## $@ - args to pass to echowarn() {  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=1        if ($0 == "") {          exit        } else {          print        }      }      f != "-h"      '}# Returns the highest number in the given arguments## $@ - one or more numeric argumentsmax() {  local max=0 arg  for arg; do    (( ${arg:-0} > max )) && max="$arg"  done  printf "%s" "$max"}# Formats a table in markdown format## $1 - field separator stringformat_table() {  local fs="$1" buffer col current_col=0 current_row=0 min=3  local -a lengths=()  buffer="$(cat)"  # First pass to get column lengths  while read -r line; do    current_col=0    while read -r col; do      lengths["$current_col"]="$(max "${#col}" "${lengths[$current_col]}")"      current_col=$((current_col + 1))    done

举报 回复 使用道具