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

How to extract tabular data from a redmine/textile page with AWK in order to declare variables in a shell script?

我需要从 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.

感兴趣的信息在class"metadata"的table中。

我希望输出为:

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

... 这样我就可以在我的 shell 脚本中在此输出上直接调用 declare 来设置变量 TITLEVERSIONNUM

这是我目前得到的:

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

呈现:

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

这不是我想要的...我需要一个衬里只在 table(元数据)上工作并去掉尾随空格。

我该怎么做?

编辑:我忘记了我尝试的渲染中的引号。

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

提取两个模式之间的线中得到解决,并且通过使用PAT1和PAT2之间的打印线有一个简单的解决方案 - 不是包括PAT1和PAT2 解法:

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

在你的例子中,从 "table(metadata)" 到一个空行:

$ 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:]]*$/,"",);sub(/[[:space:]]*$/,"",); printf "%s=\"%s\"\n", , }' file

即提取第 2 和第 3 个字段,使用 sub(/[[:space:]]*$/, "", field) 删除所有尾随空格,最后以所需格式打印一行。

请注意使用 [[:space:]] 来匹配制表符或空格。它是 POSIX 字符 class 等同于 \s,您可以将其与 GNU-awk 一起使用。

一起:

$ awk -F"|" '/table\(metadata\)/ {flag=1; next} /^$/ {flag=0} flag {sub(/[[:space:]]*$/,"",);sub(/[[:space:]]*$/,"",); printf "%s=\"%s\"\n", , }' 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:]]*$/,"",);
   sub(/[[:space:]]*$/,"",);
   printf "%s=\"%s\"\n", , 
}

并执行:

awk -f sc.awk file