我需要从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
来设置变量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 "
这不是我想要的...我需要一个班轮只能在桌子上工作(元数据)并摆脱尾随空格。
我该怎么办?
修改:我在渲染尝试时忘记了引号。
答案 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