awk语法错误模式匹配

时间:2014-05-22 14:44:49

标签: awk

我想匹配每一个空行,当它是一个空行时,我想转到下一行。 问题是当我输入

/^$/ { next }

它总是给我一个语法错误。它总是指第一个' {'。我认为这是正确的语法。有人可以帮帮我吗?

我的剧本:

BEGIN{
    FS="  "
    matching=0
    num=0
}
{
    /^$/ { next }
    if(matching==1 && num>=NF){
        print("")
        matching=0
    }
    if(match($NF,type)>0){
        for(i=1;i<=NF;i++){
            printf($i)
        }
        printf("\n")
        num=NF
        matching=1
        next
    }
    if(matching==1){
        for(i=1;i<=NF-num;i++){
            printf("  ")
        }
        printf($NF)
        printf("\n")
    }
}
END{

}

这是我的剧本

2 个答案:

答案 0 :(得分:4)

您正尝试在 pattern {action}块中使用{action}语法。

您需要将/^$/ {next}行移到第6行开始的操作块之外(通过将其移动到该开头 {上方来获得您想要的内容。或者使用{ {1}}动作块中的样式匹配。

你的剧本:

if

答案 1 :(得分:4)

您的脚本有几个问题,如下所示:

BEGIN{
    FS="  "
    matching=0     # No need to init variables to zero, this is default behavior.
    num=0          # Ditto.
}
{
    /^$/ { next }  # You can't just use "condition { action }" when you're already
                   # inside an awk action block. Move this outside of the action
                   # block or change it to "if (/^$/) { next }"
    if(matching==1 && num>=NF){
        print("")  # print is a builtin not a function. Just do print "".
        matching=0
    }
    if(match($NF,type)>0){
        for(i=1;i<=NF;i++){
            printf($i)    # printf is a builtin, not a function and NEVER put input data
                          # where the printf formatting string should be. Change this to
                          # printf "%s", $i
        }
        printf("\n")      # print ""
        num=NF
        matching=1
        next
    }
    if(matching==1){
        for(i=1;i<=NF-num;i++){
            printf("  ")  # printf "  "
        }
        printf($NF)       # printf "%s", $NF
        printf("\n")      # print ""
    }
}
END{                      # unused and unnecessary, remove this section.

}

我怀疑如果您发布了一些示例输入和预期输出,我们可以帮助您编写更好(更简洁,更具风格)的脚本。