У меня есть входной файл с несколькими абзацами, разделенными как минимум двумя новыми строками (\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
Я хочу напечатать только значение Var2
из записей R1
и R3
(где 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
(значение Var2 из R1), он печатает следующее:
[Record R1]
Var1=0
20
Var3=5
[Record R3]
Var1=2
Var3=5
Var5=19
Намерениечто регулярное выражение в команде gensub будет захватывать все символы (новые строки: \n
; и не новые строки: .
) до и после Var2=XX
и заменять все на XX
.Но вместо этого он только захватывает символы в одной строке с Var2=XX
.Может ли awk
gensub
выполнять такую многострочную подстановку?
Я знаю, что альтернативой было бы зациклить все поля в записи, разделив поле, соответствующее Var2=
, назнак =
, но это менее эффективно, когда я масштабирую его до нескольких переменных.