如何用Bash脚本实现指定结构化文本的格式转换?
使用Bash脚本实现结构化文本格式转换
输入示例
"4-QUEIJOS": Mucarela Provolone Catupiry Ricota Oregano "A-MODA": Mucarela Presunto Calabresa Bacon Tomate Milho Oregano "ALHO-E-OLEO": Mucarela Alho oleo Oregano "PEITO-DE-PERU-ESPECIAL": Mucarela Peito-de-Peru Catupiry Oregano
输出示例
"4-QUEIJOS": ["mucarela", "provolone", "catupiry", "ricota", "oregano"], "A-MODA": ["mucarela", "presunto", "calabresa", "bacon", "tomate", "milho", "oregano"], "ALHO-E-OLEO": ["mucarela", "alho", "oleo", "oregano"], "PEITO-DE-PERU-ESPECIAL": ["mucarela", "peito-de-peru", "catupiry", "oregano"]
转换要求
- 将冒号(:)后的单词转为小写
- 在这些单词间添加逗号
- 用方括号([])包裹这些单词
- 除最后一行外,每行末尾添加逗号
解决方案
可以用awk命令高效实现文本格式转换,以下是两种使用方式:
方式1:处理文件
假设输入文本保存在input.txt中,执行命令:
awk -F': ' 'BEGIN { getline < ARGV[1]; NR_total = NR; close(ARGV[1]); ARGV[1]="-" } { printf "%s: [", $1; for (i=2; i<=NF; i++) { if (i>2) printf ", "; printf "\"%s\"", tolower($i); } printf "]%s\n", NR != NR_total ? "," : "" }' input.txt
方式2:处理标准输入
直接输入文本后按Ctrl+D结束输入,执行命令:
awk -F': ' 'BEGIN { NR_total = ARGC-1 } { printf "%s: [", $1; for (i=2; i<=NF; i++) { if (i>2) printf ", "; printf "\"%s\"", tolower($i); } printf "]%s\n", NR != NR_total ? "," : "" }' -
命令解释
-F': ':设置字段分隔符为冒号加空格,将每行拆分为标题($1)和食材列表($2到$NF)两部分BEGIN块:提前获取总行数,用于判断是否为最后一行- 循环处理食材列表:
tolower($i):将每个单词转为小写- 除第一个食材外,前面添加逗号分隔
- 用双引号包裹每个单词
printf "]%s\n", NR != NR_total ? "," : "":闭合方括号,非最后一行末尾加逗号,最后一行不加
内容的提问来源于stack exchange,提问作者Bruno Peixoto
相关产品推荐
相关产品推荐

