在awk中的环境变量中引用ANSI转义序列

时间:2015-06-04 18:19:31

标签: bash awk

我正在共享一个源文件,为不同的颜色定义不同的ANSI转义码。代码来自一个shellcript(bash),它也启动一个awk脚本,并在awk中引用envvars。

但是我没有得到我想要的输出 - 即颜色。

bash中的示例:

export Red='\033[0;31m'
export Color_Off='\033[0m'

  # This works, Output is "Hello" in Red
echo $Red Hello $Color_Off

awk中的示例(envvars仍然被导出/设置):

  # This does not
$ awk 'BEGIN { print "Output: " ENVIRON["Red"] "Hello" ENVIRON["Color_Off"] }'
Output: \033[0;31mHello\033[0m

  # This works, Output is "Hello" in Red
awk 'BEGIN { R="\033[0;31m" ; O="\033[0m" ; print R "Hello" O }'

我假设答案就在我面前,但我现在却找不到它。

2 个答案:

答案 0 :(得分:1)

尝试使用以下awk命令(稍微修改一下):

$ awk -v R=$Red -v O=$Color_Off 'BEGIN { print R "Hello" O }'

答案 1 :(得分:1)

有一种方法可以实现这一点,但您需要稍微区别地声明颜色转义序列。使用ANSI C引用直接插入转义序列而不是使用转义引导的字符串,并让shell稍后扩展:

export Red=$'\e[0;31m'
export Color_Off=$'\e[0m'
awk 'BEGIN { print "Output: " ENVIRON["Red"] "Hello" ENVIRON["Color_Off"] " Bye" }'

这应该按预期工作。我也相信这是宣告颜色的最佳方式(例如,它在Zsh's colors contrib function中以这种方式完成)。