如何使用AWK从redmine / textile页面提取表格数据,以便在shell脚本中声明变量?

时间:2017-06-16 09:19:25

标签: bash awk redmine textile

我需要从redmine格式化的页面中提取数据,以便在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!"

...以便我可以在此输出的shell脚本中直接调用declare来设置变量TITLEVERSIONNUM等。

这是我到目前为止所得到的:

$ 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 "

这不是我想要的...我需要一个班轮只能在桌子上工作(元数据)并摆脱尾随空格。

我该怎么办?

修改:我在渲染尝试时忘记了引号。

1 个答案:

答案 0 :(得分:1)

这里要解决两件事:选择行的范围并从这些行中选择适当的数据。

How to select lines between two patterns?中解决了在两种模式之间提取的问题,并通过使用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:]]匹配制表符或空格。它是与\s等效的POSIX字符类,可以与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