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

时间:2017-07-18 17:52:13

标签: awk gawk

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

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

输入

templateUrl: 'components/textfield/textfield.template.html',
  controller: bltTextfieldController,
  bindings: {
    model: '=',
    name: '@',
    label: '@',
    type: '@',
    minlength: '<',
    maxlength: '<',
    min: '<',
    max: '<',
    change: '&',
    rows: '<',
    validate: '<',
    required: '<',
    autofocus: '<',
    autocomplete: '<',
    autocorrect: '<',
    spellcheck: '<',
    disabled: '<',
    pattern: '@',
    tabindex: '<',
    step: '<'
  }
};

预期输出

name
label
type
pattern

什么有效:

  • 找到模式(即&#34;绑定:}&#34;}
  • 替换
  • 打印数组

什么行不通:

  • 具有特殊字符的开关结构
  • 将元素添加到arras的结尾

目前输出一个空行。

我在Windows 10上使用Cygwin,如果这很重要,我的其余部分工作得很漂亮。这是更大的bash脚本的一部分。

我知道其他人在此之前已经问过有关在Gawk中添加数组末尾的问题,但这些解决方案都不适用于我。我已经尝试了所有thisthis并不适用于我。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

$ 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

以上内容适用于任何UNIX机器上的任何awk。如果您实际上并不关心namelabel等打印的顺序与您在输入中显示的顺序相匹配,那么更简单的解决方案就是保存$1 s作为数组索引并使用in运算符访问它们:

    else if ($2 == "@") {
        text_binding_arr[$1]
    }
    ...
    for (i in text_binding_arr) {
        print i
    }

另外,考虑一下(使用GNU awk实现真正的多维数组):

$ 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