在Gawk中将元素保存到数组末尾

在Gawk中将元素保存到数组末尾,awk,gawk,Awk,Gawk,我试图制作一个程序,从读取绑定的行开始读取文件中的行:{并以}结束,同时删除冒号、逗号和单引号。最后,我希望根据第二个字段包含的内容将这些行的内容保存到不同的数组中 declare -a text_binding_arr gawk '/(bindings: \{)/, /\}/ { gsub(/:/, "") gsub(/\047/, "") gsub(/\054/, "") switch($2) { case /=/:

我试图制作一个程序,从读取绑定的行开始读取文件中的行:{并以}结束,同时删除冒号、逗号和单引号。最后,我希望根据第二个字段包含的内容将这些行的内容保存到不同的数组中

declare -a text_binding_arr 

gawk '/(bindings: \{)/, /\}/ { 
    gsub(/:/, "")
    gsub(/\047/, "")
    gsub(/\054/, "")

    switch($2) {
        case /=/:
            two_way_binding_arr+=( "$1" )
            break   
        case /\@/:
            text_binding_arr+=( "$1" )
            break
        case /</:
            one_way_binding_arr+=( "$1" )
            break
        case /&/:   
            method_binding_arr+=( "$1" )
            break
        default:
            break
    }
}' test/components/temp."$COMPO".module.js 


for a in text_binding_arr; do echo "${text_binding_arr[@]\n}"; done
工作原理:

查找模式,即绑定:} 替换 打印阵列 什么不起作用:

具有特殊字符的开关结构 将元素添加到arras的末尾 它当前输出一个空行

如果有必要的话,我正在Windows10上使用Cygwin,我的脚本的其余部分工作得非常出色。这是更大的bash脚本的一部分

我知道之前有人在Gawk中询问过关于添加到数组末尾的问题,但这些解决方案都不适合我。我已经尝试了所有的方法,但并没有真正适用于我。有什么帮助吗

$ cat tst.awk
inBindings {
    gsub(/[:,\047]/,"")
    if ($2 == "=") {
        two_way_binding_arr[++num_two_way_bindings] = $1
    }
    else if ($2 == "@") {
        text_binding_arr[++num_text_bindings] = $1
    }
    else if ($2 == "<") {
        one_way_binding_arr[++num_one_way_bindings] = $1
    }
    else if ($2 == "&") {
        method_binding_arr[++num_method_bindings] = $1
    }
    else {
        exit
    }
}
/^[[:space:]]*bindings:[[:space:]]*{/ {
    inBindings=1
}
END {
    for (i=1; i<=num_text_bindings; i++) {
        print text_binding_arr[i]
    }
}

$ awk -f tst.awk file
name
label
type
pattern

也可以考虑使用GNUAWK对真多维数组:

$ cat tst.awk
inBindings {
    gsub(/[:,\047]/,"")
    if ( $1 == "}" ) {
        exit
    }
    binding_arr[$2][$1]
}
/^\s*bindings:\s*{/ {
    inBindings=1
}
END {
    for (char in binding_arr) {
        print char
        for (val in binding_arr[char]) {
            print "\t" val
        }
    }
}


请[在代码标签中发布带有预期输出的示例输入\文件,以便我们可以在相同的方面为您提供更多帮助。只添加了所有内容。您可以在此处添加仅获取预期输出的条件/逻辑/要求吗?我不太清楚您的意思:仅获取该输出背后的逻辑是什么?@uhuhoksure这不是您想要的吗?
$ cat tst.awk
inBindings {
    gsub(/[:,\047]/,"")
    if ($2 == "=") {
        two_way_binding_arr[++num_two_way_bindings] = $1
    }
    else if ($2 == "@") {
        text_binding_arr[++num_text_bindings] = $1
    }
    else if ($2 == "<") {
        one_way_binding_arr[++num_one_way_bindings] = $1
    }
    else if ($2 == "&") {
        method_binding_arr[++num_method_bindings] = $1
    }
    else {
        exit
    }
}
/^[[:space:]]*bindings:[[:space:]]*{/ {
    inBindings=1
}
END {
    for (i=1; i<=num_text_bindings; i++) {
        print text_binding_arr[i]
    }
}

$ awk -f tst.awk file
name
label
type
pattern
    else if ($2 == "@") {
        text_binding_arr[$1]
    }
    ...
    for (i in text_binding_arr) {
        print i
    }
$ cat tst.awk
inBindings {
    gsub(/[:,\047]/,"")
    if ( $1 == "}" ) {
        exit
    }
    binding_arr[$2][$1]
}
/^\s*bindings:\s*{/ {
    inBindings=1
}
END {
    for (char in binding_arr) {
        print char
        for (val in binding_arr[char]) {
            print "\t" val
        }
    }
}
$ awk -f tst.awk file
<
        spellcheck
        autocomplete
        maxlength
        tabindex
        autocorrect
        step
        minlength
        required
        disabled
        rows
        min
        autofocus
        max
        validate
=
        model
&
        change
@
        type
        name
        pattern
        label