Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 将bash正则表达式模式作为awk中更大正则表达式模式的一部分传递_Regex_Bash_Shell_Awk_Scripting - Fatal编程技术网

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

Regex 将bash正则表达式模式作为awk中更大正则表达式模式的一部分传递,regex,bash,shell,awk,scripting,Regex,Bash,Shell,Awk,Scripting,我试图在我的脚本中做到这一点: 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}

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

 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的一些文章

<>但这是在使用正则表达式作为AWK时,而不是把它看作更大正则表达式的一部分。


如何实现这一点?

编辑:要从
sh-x
跟踪中获得预期的输出,请阅读以下答案。要创建正确的awk代码,请阅读@ghoti的答案

$
扩展不会发生在单引号(
)中,而是发生在双引号中
”。请尝试:

CONTEXT_PAT1="\[[gG][lL][oO][bB][aA][lL]\]"

awk 'f;/^[:space:]'"${CONTEXT_PAT1}"'[:space:]*$/{f=1}' "${CONFIG_FL}"

shell不会为您扩展*pat1实际上,您可以与变量或函数进行匹配。这只是一种隐式的简写,其中RE要匹配整行,而没有机制在更大的RE中嵌入变量。因此,您可能希望显式地使用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

不确定我是否遗漏了什么,
-v
在这里没有任何值?@RavinderSingh13 fixed;)我可以建议你不要这样做吗?以这种方式嵌入变量通常被认为是不好的做法。使用
-v
传递变量要安全得多。当您按照此答案执行操作时,会出现一些小的、意外的情况,导致您的脚本中断,或者更糟的是易受攻击。@ghoti True,但这满足了问题中
sh-x
的预期输出。不要这样做,这是错误的方法。在给定特定输入的情况下,生成预期输出的代码是正确答案的起点,而不是终点。请在您的帖子中添加一些输入和预期输出示例,以便我们也可以测试我们的代码。只要您的regepx(它是regexp,而不是“模式”),这就是正确答案-图案适用于被子和毛衣,在软件中,我们应尽量明确和具体说明我们使用的结构)不包含您不希望解释的反斜杠。如果确实如此,则在参数列表中传递regexp。看。@ghoti它实际上不起作用。我正在放置调试行(我的意思是
sh-x
)。对于第一个:
++awk-v'pat1=[[[][gG][lL][oO][bB][aA][lL][]]]”开始{re=“^[:space:][]*”pat1[[:space:][]*$”}f$0~re{f=1}'/etc/samba/smb.conf
。对于第二个:
++awk-v'pat1=[[[[][gG][lL][oO][bB][aA][lL][]]f$0~sprintf(“^[:space:][]*%s[[:space:][]*$”,pat1){f=1}'/etc/samba/smb.conf
,我肯定第三个会展开…@dig_123,请记住,
sh-x
只显示shell行是如何展开的,它无助于调试awk脚本或查看数据是如何被解释的。当我写这篇文章时,我使用了我创建的示例输入,因为在您的问题中没有输入,我的代码处理了这个问题。如果您可以在问题示例输入中添加它无法使用的内容,我很乐意帮助您找出原因。