How to copy partial contents (specifically few sections denoted by square brackets) from one file to another with shell script?

I have one project's .git/config file in which I have following contents:

[user]
    name = <FullName>
    email = <EmailID>
    username = <UserName>
[core]
    editor = nvim
    whitespace = fix,-indent-with-non-tab,trailing-space,cr-at-eol
    pager = delta
[web]
    browser = google-chrome
....
....
[alias]
    a = add --all
    ai = add -i
    #############
    ap = apply
    as = apply --stat
    ac = apply --check
....
....
[filter "lfs"]
    clean = git-lfs clean -- %f
    smudge = git-lfs smudge -- %f
    process = git-lfs filter-process
    required = true

Now I want to copy multiple sections and their contents like [alias], [filter "lfs"] etc. but not the [user] and [web] sections from this .gitconfig file to another project's (which is under same parent as this project's directory) .gitconfig file.

Now I know I can loop thro' and print lines of this file, but not idea how to write multiple sections to another file(with less code clutter as possible) such that it doesn't overwrite target file's original contents:

while read line || [ -n "$line" ]; do echo $line; done < $filename;

Help is much appreciated...


Solution 1:

While you could do this via bash/awk, I'd recommend using an INI file parser. For example, you can do the following in Python using configparser library:

import sys
import configparser

def print_section(conf, section):
    print("[{}]".format(section))
    for key in conf[section]:
        print("    {} = {}".format(key, conf[section][key]))


c = configparser.RawConfigParser()
c.read('config.ini')

sections = ['alias', 'filter "lfs"']
for s in sections:
    print_section(c, s)

Oneliner of the same:

printf "import sys; import configparser; c = configparser.RawConfigParser(); c.read('config.ini'); sections = ['alias', 'filter \"lfs\"'];\nfor s in sections:\n  print(\"[{}]\".format(s));\n  for key in c[s]:\n    print(\"    {} = {}\".format(key, c[s][key]))"  | python3