我把这一行作为文件中的一行
show = "holder"; // [holder: Dispensor,dryer: Hair Dryer,bidet: Bedit,cover: Cover,wall mount: Wall Mount,screwdriver cutout: Screwdriver Cutout, assembly: Assembly,exploded: Exploded,vitamin: Vitamin]
我想要的是生成一个shell脚本文件,其中为每个xxx:yyy对生成以下行:
openscad --quite --export-format --D 'show=xxx' binstl -o xxx.stl $1
上面的$1是shell脚本的第一个参数。
我试过这个代码:
match($0, /\[[^\n\]]*\]$/) { # get [xx:yy, aa:bb]
s = substr($0, RSTART+1, RLENGTH-2); # strip the [ and ]
n = split(s, arr,","); # split the pairs
for(x in arr) { # for each pair
match(arr[x], /([^\n:]+)/, b) { # get the first field of the pair
print subsgtr(b[1], RSTART, RLENGTH)
}
}
}
结果是:
gawk: prog:5: match(arr[x], /([^\n:]+)/, b) { # get the first field of the pair
gawk: prog:5: ^ syntax error
我也试过这个:
match($0, /\[[^\n\]]*\]$/) { # get [xx:yy, aa:bb]
s = substr($0, RSTART+1, RLENGTH-2); # strip the [ and ]
n = split(s, arr,","); # split the pairs
for(x in arr) { # for each pair
arr[x] ~ /([^\n:]+)/ print
}
}
gawk: prog:5: arr[x] ~ /([^\n:]+)/ print
gawk: prog:5: ^ syntax error
还有这个
match($0, /\[[^\n\]]*\]$/) { # get [xx:yy, aa:bb]
s = substr($0, RSTART+1, RLENGTH-2); # strip the [ and ]
n = split(s, arr,","); # split the pairs
for(x in arr) { # for each pair
arr[x] ~ /([^\n:]+)/ { print }
}
}
gawk: prog:5: arr[x] ~ /([^\n:]+)/ { print }
gawk: prog:5: ^ syntax error
我不明白为什么我得到的语法错误。如果你给我一个不同的/更好的解决方案,如果可以的话,请解释语法错误,这样我就可以更多地了解awk。谢谢你,谢谢
2条答案
按热度按时间nue99wik1#
awk
模式操作语句表示为condition {action}
。你不能在一个动作中使用相同的模式动作形式。使用if
语句。例如,将arr[x] ~ /([^\n:]+)/ print
替换为if(arr[x] ~ /([^\n:]+)/) print
。对于您的问题,在给定的示例中,您可以将输入字段分隔符定义为正则表达式,并跳过第一个和最后一个字段。例如,与预期输出相比,添加了引号(因为您在那里有一些空格),并修复了2个错别字(
quiet
和--export-format binstl
):注意:另一种方法是编写一个通用的bash脚本,在其中使用
awk
来提供一个循环。在下面的示例中,输入文件作为第二个参数($2
)传递:cunj1qz12#
这种方法会奏效吗?
示例数据:
潜在解决方案: