我试图制作一个程序,从读取"绑定的行开始读取文件中的行:{"并以"}"结束,沿途删除冒号,逗号和单引号。最后,我想根据第二个字段包含的内容将这些行的内容保存到不同的数组中。
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
什么有效:
什么行不通:
目前输出一个空行。
我在Windows 10上使用Cygwin,如果这很重要,我的其余部分工作得很漂亮。这是更大的bash脚本的一部分。
我知道其他人在此之前已经问过有关在Gawk中添加数组末尾的问题,但这些解决方案都不适用于我。我已经尝试了所有this和this并不适用于我。有什么帮助吗?
答案 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。如果您实际上并不关心name
,label
等打印的顺序与您在输入中显示的顺序相匹配,那么更简单的解决方案就是保存$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