В bash извлечь выбранные свойства из стандартного файла свойств в одну строку с разделителями? - PullRequest
0 голосов
/ 29 февраля 2020

В bash:

1) Для данного groupname интереса и
2) списка keys интереса, для которого мы хотим таблицу значений , для этого имя группы ,
3), считанные в наборе файлов как в /usr/share/applications (см. упрощенный пример ниже) ,
4) и создайте таблицу с разделителями, по одной строке на файл и по одному полю для каждого данного ключа.


ПРИМЕР

входы

Нам нужны только значения ключей Name и Exe c, только с [Desktop Entry] групп и из одного или нескольких файлов, например:

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

..

[Desktop Entry]
Comment=Close
Name=Root2

output

Две строки, по одной на входной файл, каждая в Формат <Name>,<Exec> с разделителями, готовый для импорта в базу данных:

Root,e2
Root2,

Каждый входной файл:

  • Один или несколько блоков строк, разделенных [some -groupname].
  • Ниже каждого [. *] находится одна или несколько стандартных несортированных пар ключ = значение.
  • Не каждый блок содержит одинаковый набор ключей.

[Простите, если я прошу решение старой проблемы, но я не могу похоже, нашел хороший, быстрый bash способ сделать это. Да, я мог бы написать код за некоторое время и прочитать циклы и т. Д. c ... но, конечно, это было сделано раньше.]


По аналогии с этим Q но нужен более общий ответ.

1 Ответ

2 голосов
/ 29 февраля 2020

Если 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 file3, dir/file* или как угодно.

...