在bash提取中,从标准属性文件中选择属性到单个分隔行?

时间:2020-02-29 02:53:46

标签: bash key-value

bash中

1)对于给定的groupname 感兴趣的人,并且
2)感兴趣的keys 列表,为此我们需要一个表,用于此组名
3)读入一组文件,就像/usr/share/applications (请参见下面的简化示例)中的文件一样, 4)并生成一个分隔表,每个文件一行,每个给定键一个字段。


示例

输入

我们只需要[Desktop Entry]组以及一个或多个文件中的 Name Exec 键的值,如下所示:

[Desktop Entry]
Name=Root
Comment=Opens
Exec=e2

..

[Desktop Entry]
Comment=Close
Name=Root2

输出

两行,每个输入文件一行,每行以定界<Name>,<Exec>格式,准备导入数据库:

Root,e2
Root2,

每个输入文件是:

  • 由[some-groupname]分隔的一个或多个行块。
  • 每个[。*]下面是一个或多个标准的,未排序的key = value对。
  • 并非每个块都包含相同的键集。

[请原谅,如果我正在寻求解决旧问题的方法,但是我似乎找不到一种快速的好方法来做到这一点。是的,我可以花一些时间编写代码并读取循环等,但是肯定已经完成了。]


类似于this Q,但需要更笼统的答案。

1 个答案:

答案 0 :(得分:2)

如果选择awk,请尝试以下操作:

awk -v RS="[" -v FS="\n" '{     # split the file into records on "["
                                # and split the record into fields on "\n"
    name = ""; exec = ""        # reset variables
    if ($1 == "Desktop Entry]") {
                                # if the groupname matches
        for (i=2; i<=NF; i++) { # loop over the fields (lines) of "key=value" pairs
            if (sub(/^Name=/, "", $i)) name = $i
                                # the field (line) starts with "Name="
            else if (sub(/^Exec=/, "", $i)) exec = $i
                                # the field (line) starts with "Exec="
        }
        print name "," exec
    }
}' file

您可以将多个文件作为file1 file2 file3dir/file*或其他任何文件来填充。