我正在一个bash脚本中构建模式pn_ere、beg_ere和end_ere,这个脚本最终在awk脚本中使用。我希望在awk脚本中构造模式,让用户能够为faml和asmb提供值,而不是传递完整的pn_ere、beg_ere和end_ere。我怎么能做这个改变呢?
nfaml=${faml:-"[[:graph:]]+"} # Use GPH if FAML null ("" or '')
nasmb=${asmb:-"[[:graph:]]+"} # Use GPH if ASMB null ("" or '')
kw=".*"
## Pattern pn_ere matches comment characters. ## ;; !! @c //
local pn_ere="^[[:space:]]*([#;!]+|@c|//)[[:space:]]+"
beg_ere="${pn_ere}(${nfaml}) ${ebl}(${nasmb})${ebr}${spc}(${kw})$"
end_ere="${pn_ere}END OF ${nfaml} ${ebl}${nasmb}${ebr}${spc}$"
awk -f "${trk}"/densel -v pn_ere="$pn_ere" \
-v beg_ere="$beg_ere" -v end_ere="$end_ere" \
"$filename"发布于 2023-02-24 00:12:18
这就是你想做的(未经测试的)吗?
nfaml=${faml:-"[[:graph:]]+"} # Use GPH if FAML null ("" or '')
nasmb=${asmb:-"[[:graph:]]+"} # Use GPH if ASMB null ("" or '')
kw='.*'
awk -v nfaml="$nfaml" -v nasmb="$nasmb" -v kw="$kw" '
BEGIN {
ebl = "foo"
ebr = "bar"
spc = "whatever"
## Pattern pn_ere matches comment characters. ## ;; !! @c //
pn_ere = "^[[:space:]]*([#;!]+|@c|//)[[:space:]]+"
beg_ere = sprintf("%s(%s) %s(%s)%s%s(%s)$", pn_ere, nfaml, ebl, nasmb, ebr, spc, kw)
end_ere = sprintf("%sEND OF %s %s%s%s%s$", pn_ere, nfaml, ebl, nasmb, ebr, spc)
}
<... rest of script using the above ...>
' "$filename"您也可以通过连接设置beg_ere和end_ere,例如:
beg_ere = pn_ere "(" nfaml ") " ebl "(" nasmb ")" ebr spc "(" kw ")$"但是,当字符串很长时,使用sprintf()将格式与数据分离开来更干净/更简单。
https://unix.stackexchange.com/questions/736628
复制相似问题