我的文件包含缩进行,例如:
table 't'
field 'abc'
field 'def' and @enabled=true
field 'ghi'
table 'u'
我想将其转换为:
table 't'
field 'abc' [info about ABC]
field 'def' [info about DEF] and @enabled=true
field 'ghi' [info about GHI]
table 'u'
其中括号之间的字符串来自shell脚本(get-info
)的调用,它获取术语'abc','def'和'ghi'的定义。
我尝试使用AWK(通过cmd | getline output
机制):
awk '$1 == "field" {
$2 = substr($2, 2, length($2) - 2)
cmd = "get-info \"" $2 "\" 2>&1 | head -n 1" # results or error
while (cmd | getline output) {
print $0 " [" output "]";
}
close(cmd)
next
}
// { print $0 }'
但它不尊重缩进!
我怎么能实现我的愿望?
答案 0 :(得分:0)
看起来你要做的就是:
$1 == "field" {
cmd = "get-info \"" substr($2,2,length($2)-2) "\" 2>&1" # results or error
if ( (cmd | getline output) > 0 ) {
sub(/^[[:space:]]*[^[:space:]]+[[:space:]]+[^[:space:]]+/,"& ["output"]")
}
close(cmd)
}
{ print }
请注意,您不需要head -1
,只是不要在循环中读取输出。
e.g:
$ cat tst.awk
$1 == "field" {
cmd = "echo \"--->" substr($2,2,length($2)-2) "<---\" 2>&1"
if ( (cmd | getline output) > 0 ) {
sub(/^[[:space:]]*[^[:space:]]+[[:space:]]+[^[:space:]]+/,"& ["output"]")
}
close(cmd)
}
{ print }
$ awk -f tst.awk file
table 't'
field 'abc'
field 'def' [--->def<---] and @enabled=true
field 'ghi'
table 'u'
这是一个罕见的场合,使用getline
可能是合适的,但如果您正在考虑使用{{1,请确保您在http://awk.info/?tip/getline阅读并理解所有getline
警告再次。