【发布时间】:2019-07-19 07:06:48
【问题描述】:
我有一个输入文件,其中包含由至少两个换行符 (\n\n) 分隔的多个段落,并且我想从某些段落中的行中提取字段。我认为如果我能让gensub 像我希望的那样工作,那么处理将是最简单的。考虑以下输入文件:
[Record R1]
Var1=0
Var2=20
Var3=5
[Record R2]
Var1=10
Var3=9
Var4=/var/tmp/
Var2=12
[Record R3]
Var1=2
Var3=5
Var5=19
我只想从记录R1 和R3 中打印Var2 的值(其中Var2 实际上并不存在)。我可以通过设置RS="\n\n" 轻松地将所有变量分组到对应的记录中,然后它们都包含在$0 中。但是由于我不知道它会提前出现在列表的哪个位置,所以我想使用 gensub 之类的东西来提取它。这就是我要做的:
awk '
BEGIN {
RS="\n\n"
}
/Record R1/ || /Record R3/ {
print gensub(/[\n.]*Var2=(.*)[\n.]*/, "\\1", "g", $0)
}
' /tmp/input.txt
但不是只打印20(R1 中 Var2 的值),而是打印以下内容:
[Record R1]
Var1=0
20
Var3=5
[Record R3]
Var1=2
Var3=5
Var5=19
目的是 gensub 命令中的正则表达式将捕获 Var2=XX 之前和之后的所有字符(换行符:\n;和非换行符:.)并将所有内容替换为XX。但相反,它只捕获与Var2=XX 在同一行的字符。 awk的gensub可以做这种多行替换吗?
我知道另一种方法是循环遍历记录中的所有字段,在= 符号上拆分与Var2= 匹配的字段,但是当我将其扩展到多个变量时感觉效率较低。
【问题讨论】:
标签: regex awk substitution