最後に、awkスクリプトで使用するスキーマ、、およびpn_ere
bashbeg_ere
スクリプトを作成しています。ユーザーが全体を渡すのではなく、値を提供できるend_ere
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"
答え1
これはあなたが望むものですか(テストされていません)?
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()
しかし、IMHO、文字列が長い場合、データから型を分離する方がクリーンで簡単です。