在bash中使用awk从文件导入代码

时间:2017-03-30 14:37:47

标签: bash awk

我们想在两个字符串之间导入代码并将它们放在一个变量中。

我们有:

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 为空

1 个答案:

答案 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的默认动作)。