Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/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
Bash awk的正则表达式匹配模式可以放在操作行的左括号上方,还是必须放在同一行上?_Bash_Awk - Fatal编程技术网

Bash awk的正则表达式匹配模式可以放在操作行的左括号上方,还是必须放在同一行上?

Bash awk的正则表达式匹配模式可以放在操作行的左括号上方,还是必须放在同一行上?,bash,awk,Bash,Awk,我正在非常认真地研究awk来编写一个git-diff实现,它将显示git-diff的行号,我想确认是否有错[更新:我现在已经修复了维基百科页面的这一部分,但它以前是这么说的]: 可以将输出发送到以下文件: (pattern) { print "expression" > "file name" } /regex_pattern/ { print "expression" > "file name" } 或通过管道: (pattern) { print "exp

我正在非常认真地研究
awk
来编写一个
git-diff
实现,它将显示
git-diff
的行号,我想确认是否有错[更新:我现在已经修复了维基百科页面的这一部分,但它以前是这么说的]:

可以将输出发送到以下文件:

(pattern)
{
   print "expression" > "file name"
}
/regex_pattern/ {
    print "expression" > "file name"
}
或通过管道:

(pattern)
{
   print "expression" | "command"
}
/regex_pattern/ {
    print "expression" | "command"
}
请注意,
(图案)
位于开口撑杆上方。我很确定这是错误的,但在编辑页面之前需要确定。我认为该页面应该是这样的:

可以将输出发送到以下文件:

(pattern)
{
   print "expression" > "file name"
}
/regex_pattern/ {
    print "expression" > "file name"
}
或通过管道:

(pattern)
{
   print "expression" | "command"
}
/regex_pattern/ {
    print "expression" | "command"
}
这里有一个测试来“证明”它。我使用的是Linux Ubuntu 18.04

1。测试_awk.sh

gawk \
'
BEGIN
{
    print "START OF AWK PROGRAM"
}
'
gawk \
'
BEGIN {
    print "START OF AWK PROGRAM"
}
'
gawk \
'
/hey/ 
{
    print $0
}
'
gawk \
'
/hey/ {
    print $0
}
'
测试和错误输出:

$ echo -e "hey1\nhello\nhey2" | ./test_awk.sh
gawk: cmd. line:3: BEGIN blocks must have an action part
但有了这一点:

2。测试_awk.sh

gawk \
'
BEGIN
{
    print "START OF AWK PROGRAM"
}
'
gawk \
'
BEGIN {
    print "START OF AWK PROGRAM"
}
'
gawk \
'
/hey/ 
{
    print $0
}
'
gawk \
'
/hey/ {
    print $0
}
'
它很好用

$ echo -e "hey1\nhello\nhey2" | ./test_awk.sh
START OF AWK PROGRAM
另一个示例(未能提供预期输出):

3。测试_awk.sh

gawk \
'
BEGIN
{
    print "START OF AWK PROGRAM"
}
'
gawk \
'
BEGIN {
    print "START OF AWK PROGRAM"
}
'
gawk \
'
/hey/ 
{
    print $0
}
'
gawk \
'
/hey/ {
    print $0
}
'
错误输出:

$ echo -e "hey1\nhello\nhey2" | ./test_awk.sh
hey1
hey1
hello
hey2
hey2
但就像这样:

4。测试_awk.sh

gawk \
'
BEGIN
{
    print "START OF AWK PROGRAM"
}
'
gawk \
'
BEGIN {
    print "START OF AWK PROGRAM"
}
'
gawk \
'
/hey/ 
{
    print $0
}
'
gawk \
'
/hey/ {
    print $0
}
'
它按预期工作:

$ echo -e "hey1\nhello\nhey2" | ./test_awk.sh
hey1
hey2

更新:解决此问题后,我刚刚添加了以下部分:

学习材料:
  • 在解决这个问题的过程中,我只花了几个小时创建了以下示例:。这些示例、注释和链接对于任何开始学习
    awk
    /
    gawk
    的人都很有用
  • 相关的:
  • 首先,我学习
    awk
    的全部目的就是编写
    git diffn
    。我刚做完:

  • 您可以在示例中看到,可以用新行分隔语句,而不是语句末尾的分号。当你有

    /regex/
    { ...
    }
    
    它相当于
    /regex/;{…}
    这等于测试行为时的
    /regex/{print$0}{…}


    请注意,
    BEGIN
    END
    是特殊的标记,它们需要显式的操作语句,因为for
    BEGIN
    {print$0}
    不能作为默认操作。这就是为什么开放的花括号应该在同一条线上。也许是因为方便,但这一切都是一致的。

    您可以在示例中看到,您可以用新行分隔语句末尾的分号,而不是分号。当你有

    /regex/
    { ...
    }
    
    它相当于
    /regex/;{…}
    这等于测试行为时的
    /regex/{print$0}{…}


    请注意,
    BEGIN
    END
    是特殊的标记,它们需要显式的操作语句,因为for
    BEGIN
    {print$0}
    不能作为默认操作。这就是为什么开放的花括号应该在同一条线上。也许是因为方便,但都是一致的。

    我同意你的观点,维基百科页面是错误的。它就在awk手册中:

    模式操作语句的形式为

         pattern { action }
    
    缺少
    {action}
    表示打印该行;丢失的图案总是匹配的。模式操作语句由新行或分号分隔

    语句以分号、换行符或右大括号结尾。

    这是的手册页。GNU awk手册中也有同样的信息,只是埋藏得更深一些。美国呢

    awk程序由以下形式的成对程序组成:

    pattern { action }
    
    可以省略模式或操作(包括括起来的大括号字符)

    缺失模式应与任何输入记录相匹配,缺失动作应等同于:

    { print }
    

    我同意你的观点,维基百科页面是错误的。它就在awk手册中:

    模式操作语句的形式为

         pattern { action }
    
    缺少
    {action}
    表示打印该行;丢失的图案总是匹配的。模式操作语句由新行或分号分隔

    语句以分号、换行符或右大括号结尾。

    这是的手册页。GNU awk手册中也有同样的信息,只是埋藏得更深一些。美国呢

    awk程序由以下形式的成对程序组成:

    pattern { action }
    
    可以省略模式或操作(包括括起来的大括号字符)

    缺失模式应与任何输入记录相匹配,缺失动作应等同于:

    { print }
    

    如果你在谷歌上搜索了很多错误,比如维基百科页面有很多错误和缺失(大多数其他在线资源也是如此),忽略它,如果你想学习Awk,就去读阿诺德·罗宾斯的《有效的Awk编程》第四版。但是在所有情况下,任何时候你看到的
    模式{action}
    都应该是
    条件{action}
    ,因为,例如
    x==3
    是一个条件,而不是“模式”。不,我很好。我完成了我需要完成的工作,我已经用
    awk
    完成了一段时间。这就是我本周学习awk的目的:。此外,我建议人们,包括我自己,花时间尽可能地修复维基百科。不过,我会把这个工具放在未来的项目中,如果我需要的话,我可能会在将来研究这本书。话虽如此,我不知道,工作5天后,awk开始了30个小时,我觉得现在我可以胜任基本的工作了。再想一想,我可能听起来有点傲慢。我想让你知道:谢谢你的参考书。事实上,前几天我第一次看到你的评论时,我就把它加入了书签,并将其添加到我的亚马逊愿望列表中,以便我以后能找到它。我不认为学习awk的网络材料是不够的:我只是做了足够多的,让我对自己的成就感到满意。然而,你是对的:写得很好的嘘声