如何使用 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
来设置变量 TITLE
、VERSIONNUM
等
这是我目前得到的:
$ 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
我需要从 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
来设置变量 TITLE
、VERSIONNUM
等
这是我目前得到的:
$ 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(元数据)上工作并去掉尾随空格。
我该怎么做?
编辑:我忘记了我尝试的渲染中的引号。
这里有两件事要解决:选择行的范围并从这些行中选择合适的数据。
提取两个模式之间的线在
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