我们想在两个字符串之间导入代码并将它们放在一个变量中。
我们有:
job=1
listen="$(awk -v a="BEGIN-$job" -v e="END-$job" '/BEGIN {print a}/{p=1;next} /BEGIN {print e}/{p=0;exit} p' whatsthat.file)"
whatsthat.file(已编辑):
BEGIN-1
echo "some code"
END-1
BEGIN-2
echo "next job"
END-2
变量$listen
的最终结果应为:
echo "some code"
但上面的命令会使$listen
为空。
答案 0 :(得分:1)
您的2089
命令有几个问题,您正在寻找的是:
awk
模式 job=1
listen="$(
awk -v a="BEGIN-$job" -v e="END-$job" '$0==a {p=1;next} $0==e {exit} p && NF' whatsthat.file
)"
和$0==a
针对变量$0==e
和{{1}检查手头的输入行($0
)为了平等。如果是,则执行关联的操作(a
)。
b
,用于感兴趣范围的开始,设置(概念上)布尔标志{...}
并移动到下一个输入行;其目的是表明随后的行 - 由于在感兴趣的范围内 - 应该(可能)打印出来。
{p=1;next}
,在范围结束时执行,无条件结束处理(范围结束行,就像范围起始行一样,不应打印)。
p
是一种模式,用于测试标记{exit}
以及输入行是否为非空(p && NF
包含行上以空格分隔的字段数,以及该数字对于空行或空行是p
;如果两个条件都满足,则隐含地打印手头的输入行(在没有与模式关联的动作的情况下,这是Awk的默认动作)。