我正试图在我的脚本中做到这一点:
CONTEXT_PAT1="\[[gG][lL][oO][bB][aA][lL]\]"
awk -v pat1="$CONTEXT_PAT1" 'f;/^[:space:]*pat1[:space:]*$/{f=1}' ${CONFIG_FL}
当我在调试模式下运行它时,我看到发生了这种情况:
++ awk -v 'pat1=\[[gG][lL][oO][bB][aA][lL]\]' 'f;/^[:space:]*pat1[:space:]*$/{f=1}
预期为:
++ awk -v 'pat1=\[[gG][lL][oO][bB][aA][lL]\]' 'f;/^[:space:]\[[gG][lL][oO][bB][aA][lL]\][:space:]*$/{f=1}
我如何才能做到这一点?我在stackoverflow中浏览了一些文章。
但这是当您按原样使用正则表达式时,而不是将其视为更大的正则表达式的一部分。
如何做到这一点?
发布于 2018-05-31 14:42:51
编辑:要从sh -x
跟踪中获得预期的输出,请阅读以下答案。要创建正确的awk代码,请阅读@ghoti的答案。
$
扩展不会在单引号('
)中进行,但会在双引号"
中进行。尝试:
CONTEXT_PAT1="\[[gG][lL][oO][bB][aA][lL]\]"
awk 'f;/^[:space:]'"${CONTEXT_PAT1}"'[:space:]*$/{f=1}' "${CONFIG_FL}"
shell不会为您展开*pat1。假设您所说的“调试模式”是sh -x
发布于 2018-05-31 19:12:13
实际上,您可以与变量或函数进行匹配。这只是一种隐式的简写,其中RE旨在匹配整行,而没有机制将变量嵌入到更大的RE中。因此,您可能希望成为EXplicit,并使用RE运算符~
。
对于您的示例,我会使用如下内容:
$ pat1="[[][gG][lL][oO][bB][aA][lL][]]"
$ awk -v pat1="$pat1" 'BEGIN{re="^[[:space:]]*" pat1 "[[:space:]]*$"} f; $0~re{f=1}' file.cfg
甚至是,
$ awk -v pat1="$pat1" 'f; $0~sprintf("^[[:space:]]*%s[[:space:]]*$",pat1) {f=1}' file.cfg
我甚至可以通过省去传入不区分大小写的正则表达式的麻烦来进一步简化这个东西的使用:
$ pat1="global"
$ awk -v pat1="$pat1" 'f; tolower($0) ~ sprintf("^[[:space:]]*[[]%s[]][[:space:]]*$",tolower(pat1)) {f=1}' file.cfg
https://stackoverflow.com/questions/50618109
复制相似问题