我一直使用习惯的单引号从 bash 调用 awk 命令。 如何使用实际的字符串来存储 awk 源代码,然后将其引入到 awk 命令中?
printf '%s\n' "$@" \
| awk -v frg="$ctp" -v rst="$sgr" -v prl="$rl" \
'{ if ( $0 ~ prl ) {
fm = "%s%s%s\n" ; printf(fm, frg, $0, rst) }
else {
fm = "%s\n" ; printf(fm, $0) }
}'
变化是
str="
{ if ( $0 ~ prl ) {
fm = "%s%s%s\n" ; printf(fm, frg, $0, rst) }
else {
fm = "%s\n" ; printf(fm, $0)
}
}"
然后我可能会调用该命令
printf '%s\n' "$@" \
| awk -v frg="$ctp" -v rst="$sgr" -v prl="$rl" "$str"
最佳答案
如果没有有关您要解决的问题的更多信息 - 不要将代码存储在字符串中,请使用函数:
foo() {
awk -v frg="$ctp" -v rst="$sgr" -v prl="$rl" \
'{ if ( $0 ~ prl ) {
fm = "%s%s%s\n" ; printf(fm, frg, $0, rst) }
else {
fm = "%s\n" ; printf(fm, $0) }
}'
}
printf '%s\n' "$@" \
| foo
或者:
foo() {
awk -v frg="$1" -v rst="$2" -v prl="$3" \
'{ if ( $0 ~ prl ) {
fm = "%s%s%s\n" ; printf(fm, frg, $0, rst) }
else {
fm = "%s\n" ; printf(fm, $0) }
}'
}
printf '%s\n' "$@" \
| foo "$ctp" "$sgr" "$rl"
或类似的。
这样您就可以从 awk 脚本中封装所需的功能,同时避免 shell 脚本与 awk 脚本紧密耦合。
关于bash - 实际的 bash 字符串存储 awk 源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75704641/