awk-在操作(大括号)中使用正则表达式语句(带斜杠)
使用: 我对在awk-在操作(大括号)中使用正则表达式语句(带斜杠),awk,gawk,Awk,Gawk,使用: 我对在awk中正确使用前斜杠/内动作括号{}中的正则表达式感到有些困惑。例如,这是有效的: $ awk --version GNU Awk 3.1.7 $ echo "4,testing" | awk -F, '{if($1==4) {/test/ {print $0}}}' awk: {if($1==4) {/test/ {print $0}}} awk: ^ syntax error 使用if和match,而不是正斜杠正则表达式语法,同样有效
awk
中正确使用前斜杠/
内动作括号{}
中的正则表达式感到有些困惑。例如,这是有效的:
$ awk --version
GNU Awk 3.1.7
$ echo "4,testing" | awk -F, '{if($1==4) {/test/ {print $0}}}'
awk: {if($1==4) {/test/ {print $0}}}
awk: ^ syntax error
使用if
和match
,而不是正斜杠正则表达式语法,同样有效(前提是添加了额外的外部动作括号):
所以,我想,/REGEX/
应该等同于if(match($0,“test”))
,对吗
无论如何,我想对每个字段进行一些测试,然后对整个字符串进行正则表达式检查。。。如果按预期工作,则在中的嵌套动作括号中匹配
:
$ echo "4,testing" | awk -F, '{if(match($0, "test")) {print $0}}'
4,testing
。。。但是,如果我想用正斜杠正则表达式替换if(match(…)
,我会得到:
$ echo "4,testing" | awk -F, '{if($1==4) {if(match($0, "test")) {print $0}}}'
4,testing
谁能解释一下规则是什么,什么时候使用正斜杠正则表达式,什么时候使用match()
regex
在写这篇文章时,我意外地发现这是可行的:
$ awk --version
GNU Awk 3.1.7
$ echo "4,testing" | awk -F, '{if($1==4) {/test/ {print $0}}}'
awk: {if($1==4) {/test/ {print $0}}}
awk: ^ syntax error
。。。看起来:在一个动作中,正斜杠正则表达式必须位于
if
语句的参数中。。。但这对我来说仍然没有意义-考虑到在上面的第一个示例中,正则表达式(至少在我看来不明显)不位于if()
参数中?awk的基本语法是它是一个序列:
$ echo "4,testing" | awk -F, '{if($1==4) {if(/test/) {print $0}}}'
4,testing
是在每一行上测试的表达式;如果为true,则执行
。如果操作是{…}
块,则它必须包含语句。在语句中,要测试条件,必须使用if
另一种思考方式是,在每个awk
行的
部分周围有一个隐式if
regexp只是一种可以在条件中出现的表达式。awk的基本语法是它是一个序列:
$ echo "4,testing" | awk -F, '{if($1==4) {if(/test/) {print $0}}}'
4,testing
是在每一行上测试的表达式;如果为true,则执行
。如果操作是{…}
块,则它必须包含语句。在语句中,要测试条件,必须使用if
另一种思考方式是,在每个awk
行的
部分周围有一个隐式if
regexp只是一种可以在条件中出现的表达式。正斜杠中的字符串是
awk
中的regex字符串,就像/test/
一样,而不是一个操作,就像match()
函数是一个函数而不是一个操作一样。语法/test/{print$0}
是缩写if($0~/test/){print$0}
,其中~
是regexp比较运算符。然而,这是当条件在块之外时
您正在将{if(match($0,“test”){print$0}}
与{/test/{print$0}}
等价,但是在块内时仍需要使用if
语句:
<condition> <action>
regexp操作符~
是常用的,而不是match()
函数,尽管它有自己的用例
你真正应该做的是:
$ echo "4,testing" | awk -F, '{if($1==4) {if (/test/){print $0}}}'
4,testing
我们不需要块,因为
awk
中的默认块是{print$0}
,我们使用逻辑运算符并使用&&
测试这两个条件是否为真 前斜杠中的字符串是awk
中的正则表达式字符串,类似于/test/
而不是操作,就像match()
函数是函数而不是操作一样。语法/test/{print$0}
是缩写if($0~/test/){print$0}
,其中~
是regexp比较运算符。然而,这是当条件在块之外时
您正在将{if(match($0,“test”){print$0}}
与{/test/{print$0}}
等价,但是在块内时仍需要使用if
语句:
<condition> <action>
regexp操作符~
是常用的,而不是match()
函数,尽管它有自己的用例
你真正应该做的是:
$ echo "4,testing" | awk -F, '{if($1==4) {if (/test/){print $0}}}'
4,testing
我们不需要块,因为
awk
中的默认块是{print$0}
,我们使用逻辑运算符并使用&&
测试这两个条件是否为真 非常好的解释,@sudo_O-特别是关于速记的部分解释了我很多。为迟到道歉-干杯!非常好的解释,@sudo_O-特别是关于速记的部分解释了我很多。为迟到道歉-干杯!感谢@Barmar的回复-很抱歉回复太晚!我通常会被这样一个一般的语义解释绊倒(就像在这个例子中)——但是关于“隐式if
”的部分会有所帮助;然而,我认为@sudo_O对我错误的详细描述值得接受。干杯感谢@Barmar的回复-很抱歉回复太晚!我通常会被这样一个一般的语义解释绊倒(就像在这个例子中)——但是关于“隐式if
”的部分会有所帮助;然而,我认为@sudo_O对我错误的详细描述值得接受。干杯