首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将bash正则表达式模式作为awk中更大的正则表达式模式的一部分传递

将bash正则表达式模式作为awk中更大的正则表达式模式的一部分传递
EN

Stack Overflow用户
提问于 2018-05-31 14:38:03
回答 2查看 74关注 0票数 3

我正试图在我的脚本中做到这一点:

 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中浏览了一些文章。

https://unix.stackexchange.com/questions/120788/pass-shell-variable-as-a-pattern-to-awk?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

但这是当您按原样使用正则表达式时,而不是将其视为更大的正则表达式的一部分。

如何做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

票数 -1
EN

Stack Overflow用户

发布于 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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50618109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档