Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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
awk-在操作(大括号)中使用正则表达式语句(带斜杠)_Awk_Gawk - Fatal编程技术网

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对我错误的详细描述值得接受。干杯