在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