如何格式化sed捕获的\1模式,添加空格填充实现SQL表字段对齐
问题原因
你原来的命令失效是因为Bash的命令替换$(...)会在sed进程启动前提前执行,此时sed还没完成正则捕获,\1只会被识别为普通的字面量,所以printf输出的是固定的1加对齐空格。
解决方案1:使用awk(跨平台通用,推荐)
awk原生支持字段格式化,不需要依赖GNU扩展,单行命令即可实现需求:
awk '/^ [a-z_]/ {printf " %-14s", $1; for(i=2;i<=NF;i++) printf " %s", $i; print ""; next} 1' 你的SQL文件路径
- 逻辑说明:
- 匹配行首为4个空格+小写字母/下划线的字段定义行
- 将第一个字段(字段名)左对齐填充到14位宽度输出
- 依次输出剩余的字段类型、约束等内容
- 其他行(建表开头、结尾行)直接原样输出
解决方案2:使用GNU sed
如果你确实要使用sed实现,需要借助GNU sed特有的e修饰符,将替换结果作为shell命令执行:
# 仅支持GNU sed,macOS可通过brew install gnu-sed安装后用gsed替换sed sed -E '/^ [a-z_]/s/^ ([a-z_]+) (.*)/printf " %-14s %s" "\1" "\2"/e' 你的SQL文件路径
效果验证
两个命令执行后都会输出你期望的对齐格式:
CREATE TABLE pilot ( pi_id INTEGER PRIMARY KEY, title VARCHAR, pi_full_name VARCHAR );
内容的提问来源于stack exchange,提问作者vuvu
相关产品推荐
相关产品推荐

