Как извлечь табличные данные со страницы redmine/textile с помощью AWK, чтобы объявить переменные в сценарии оболочки?

Мне нужно извлечь данные со страницы в redmine, отформатированной в Textile, чтобы установить переменные в скрипте bash. Я хочу использовать AWK для этого. Вот содержание страницы:

$ cat mypage.redmine
h1. My Awesome page

h2. A section

hello
there

table(metadata).
|TITLE       |An awesome title! |
|VERSIONNUM  |1                 |
|VERSIONDATE |2017-06-16        |
|AUTHOR      |Me!               |

table(otherthing).
|RECORD1     |A value.      |
|RECORD2     |Another value |

h2. Another section

We say things.

Интересующая информация находится в таблице класса «метаданные».

Я хотел бы, чтобы вывод был:

TITLE="An awesome title!"
VERSIONNUM="1"
VERSIONDATE="2017-06-16"
AUTHOR="Me!"

... так что я могу напрямую вызвать declare в моем сценарии оболочки на этом выходе, чтобы установить переменные TITLE, VERSIONNUM и т. д.

Вот что я получил до сих пор:

$ awk 'BEGIN { FS = "|" } { if(NF == 4) print $2 "=" "\"" $3 "\"" }' < mypage.redmine

Что делает:

TITLE       ="An awesome title! "
VERSIONNUM  ="1                 "
VERSIONDATE ="2017-06-16        "
AUTHOR      ="Me!               "
RECORD1     ="A value.      "
RECORD2     ="Another value "

Это не то, что я ищу... Мне нужно, чтобы один вкладыш работал только с таблицей (метаданные) и избавлялся от конечных пробелов.

Как я могу это сделать?

Редактировать: я забыл кавычки в рендеринге моей попытки.


person Jordan    schedule 16.06.2017    source источник


Ответы (1)


Здесь нужно решить две вещи: выбрать диапазон строк и выбрать правильные данные из этих строк.

Чтобы извлечь строки между двумя шаблонами, рассматривается Как выбрать линии между двумя шаблонами? и имеет простое решение с использованием решения Печатать строки между PAT1 и PAT2, не включая PAT1 и PAT2:

awk '/PAT1/{flag=1; next} /PAT2/{flag=0} flag' file

В вашем случае от «таблицы (метаданные)» до пустой строки:

$ awk '/table\(metadata\)/ {flag=1; next} /^$/ {flag=0} flag' file
|TITLE       |An awesome title! |
|VERSIONNUM  |1                 |
|VERSIONDATE |2017-06-16        |
|AUTHOR      |Me!               |

Затем вы хотите удалить лишние символы. Для этого я последовал вашему же подходу: установите | в качестве FS и распечатайте на основе этого:

awk -F"|" '{sub(/[[:space:]]*$/,"",$2);sub(/[[:space:]]*$/,"",$3); printf "%s=\"%s\"\n", $2, $3}' file

То есть извлеките 2-е и 3-е поля, удалите все пробелы в конце с помощью sub(/[[:space:]]*$/, "", field) и, наконец, напечатайте строку в нужном формате.

Обратите внимание на использование [[:space:]] для соответствия табуляции или пробелам. Это эквивалент класса символов POSIX для \s, который вы можете использовать с GNU-awk.

Все вместе:

$ awk -F"|" '/table\(metadata\)/ {flag=1; next} /^$/ {flag=0} flag {sub(/[[:space:]]*$/,"",$2);sub(/[[:space:]]*$/,"",$3); printf "%s=\"%s\"\n", $2, $3}' file
TITLE="An awesome title!"
VERSIONNUM="1"
VERSIONDATE="2017-06-16"
AUTHOR="Me!"

Или поместите это в скрипт sc.awk:

BEGIN{FS="|"}
/table\(metadata\)/ {flag=1; next}
/^$/ {flag=0}
flag {
   sub(/[[:space:]]*$/,"",$2);
   sub(/[[:space:]]*$/,"",$3);
   printf "%s=\"%s\"\n", $2, $3
}

И выполните его с помощью:

awk -f sc.awk file
person fedorqui 'SO stop harming'    schedule 16.06.2017