首页 > 解决方案 > 试图将转义字符作为变量传递给 awk

问题描述

我正在使用这个命令;

awk -v regex1='new[[:blank:]]+File\(' 'BEGIN{print "Regex1 =", regex1}'

这警告我;

awk: warning: escape sequence `\(' treated as plain `(

打印;

new[[:blank:]]+File( 

我希望价值是;

new[[:blank:]]+File\(

我尝试修改命令以考虑转义字符,但总是得到相同的警告

标签: awk

解决方案


当你运行时:

$ awk -v regex1='new[[:blank:]]+File\(' 'BEGIN{print "Regex1 =", regex1}'
awk: warning: escape sequence `\(' treated as plain `('
Regex1 = new[[:blank:]]+File(

您在 shell 中将字符串分配给 awk 变量。当您-v在 awk 中使用时,您是在要求 awk 解释此类分配中的转义序列,以便\t可以成为文字制表\n符、换行符等,但是(在您的字符串中转义时没有特殊含义,因此\((,因此发出警告消息。

如果您想获得文字\字符,则需要对其进行转义,以便将其\\解释为\

$ awk -v regex1='new[[:blank:]]+File\\(' 'BEGIN{print "Regex1 =", regex1}'
Regex1 = new[[:blank:]]+File\(

您似乎正在尝试将正则表达式传递给 awk ,并且在我看来,一旦您需要 2 次转义,如果您将目标字符放入括号表达式中,您的代码会更加清晰和简单:

$ awk -v regex1='new[[:blank:]]+File[(]' 'BEGIN{print "Regex1 =", regex1}'
Regex1 = new[[:blank:]]+File[(]

如果您想为 awk 变量分配文字字符串的值而不解释转义序列,那么还有其他方法可以在不使用的情况下这样做-v,请参阅如何在 awk 脚本中使用 shell 变量?.


推荐阅读