合并打印指定区块与提取存储特定字符串的技术方案问询
任务需求与代码优化
核心任务
需要合并以下两项任务:
- 按照指定区块结构筛选并打印目标区块,区块结构示例如下:
## NFAML [NASMB] KEYWORDS ## BODY (can include empty lines) ## END OF NFAML [NASMB]
其中KEYWORDS为由逗号分隔的关键词(例如bash,resource)。
2. 在打印区块的同时,提取区块头中的NFAML、NASMB、KEYWORDS三部分内容,并将KEYWORDS按逗号拆分后存入数组。
现有Bash代码片段
spc='[[:space:]]*' ebl='\\[' # awk needs it for applying \[ ebr='\\]' # awk needs it for applying \] pn_ere='^[[:space:]]*([#;!]+|@c|//)[[:space:]]+' nfaml=${faml:-"[[:graph:]]+"} # Use GPH if FAML null ("" or '') nasmb=${asmb:-"[[:graph:]]+"} # Use GPH if ASMB null ("" or '') cmt='//' ; ebl='\[' ; ebr='\]' # for sed to apply // ] [ spc='[[:space:]]*' ; gph="[[:graph:]]+" local kys=".*" local pn_ere="^[[:space:]]*([#;!]+|@c|${cmt})[[:space:]]+" beg_ere="${pn_ere}(${nfaml}) ${ebl}(${nasmb})${ebr}${spc}(${kys})$" end_ere="${pn_ere}END OF ${nfaml} ${ebl}(${nasmb})${ebr}${spc}$" while read line; do if [[ $line =~ $beg_ere ]]; then title=${BASH_REMATCH[1]} subtitle=${BASH_REMATCH[2]} keywords=${BASH_REMATCH[3]} echo "Title: $title" echo "Subtitle: $subtitle" echo "Keywords: $keywords" fi done < $filename awk -v pnre="$pn_ere" -v begrsc="$beg_ere" -v endrsc="$end_ere" \ '$0 ~ beg_ere { insc=1; next } $0 ~ end_ere { insc=0; print "" } insc { sub(pn_ere,""); print }' "$filename"
初步Awk实现思路(待完善)
awk -v beg_ere="$beg_ere" -v pn_ere="$pn_ere" -v end_ere="$end_ere" ' $0 ~ beg_ere { title=gensub(beg_ere, "\\1", "g", $0); subtitle=gensub(beg_ere, "\\2", "g", $0); keywords=gensub(beg_ere, "\\3", "g", $0); split(keywords, kaggr, ","); print "Title: " title; print "Subtitle: " subtitle; print "Keywords: " keywords; print "kaggr: " kaggr; next } $0 ~ pn_ere { $0=gensub(pn_ere, "", "g", $0); print $0 } $0 ~ end_ere { print "" } ' "$filename"
内容的提问来源于stack exchange,提问作者Dilna
相关产品推荐
相关产品推荐

