Рейтинг:0

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

флаг et

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...

Рейтинг:2
флаг nl
P.P

Хотя вы можете сделать это с помощью bash/awk, я бы рекомендовал использовать INI-файл парсер. Например, вы можете сделать следующее в Python, используя configparser библиотека:

импорт системы
импортировать синтаксический анализатор конфигурации

def print_section(conf, раздел):
    печать ("[{}]". формат (раздел))
    для ключа в conf[section]:
        print(" {} = {}".format(ключ, conf[раздел][ключ]))


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

разделы = ['псевдоним', 'фильтр "lfs"']
для s в разделах:
    print_section (с, с)

Тот же вкладыш:

printf "import sys; import configparser; c = configparser.RawConfigParser(); c.read('config.ini'); section = ['alias', 'filter \"lfs\"'];\nдля s в разделах: \n print(\"[{}]\".format(s));\n для ключа в c[s]:\n print(\" {} = {}\".format(key, c[s ][ключ]))" | питон3
флаг et
Ваш ответ на Python хорош, но можете ли вы также указать, как я могу сделать это в Awk/Sed? Я бы очень хотел добавить его в сценарий Shell, который я уже создал
P.P avatar
флаг nl
P.P
@VickyDev Это действительно не стоит того, чтобы делать это в оболочке. Если вы хотите интегрировать это в скрипт (или запустить из командной строки), вы можете запустить то же самое, что и oneliner - обновил ответ.
флаг et
Хорошо, если я запишу это в файл, используя python, например `with open (...)`, а затем `fwrite` добавить, как я могу принудительно ввести новую строку, когда каждая следующая строка (раздела означает заголовок раздела, затем новую строку, а затем строку содержимого раздела построчной точной структуры) пишется ?
флаг et
Прямо сейчас с базовым `fwrite` он пишет 4 пробела вместо следующей строки с отступом, как мне это решить?
P.P avatar
флаг nl
P.P
@VickyDev Код в ответе форматирует разделы. Разве это не работа для вас?
флаг et
С печатью все в порядке, но, как я уже задавал вопрос, я хочу, чтобы он был записан/добавлен в другой файл. Формат просто помещает текст как есть со знаком равенства, но он не работает при записи с переводом строки и отступом в каждой строке из 4 пробелов изначально
P.P avatar
флаг nl
P.P
@VickyDev Я не уверен, что понимаю ваш вопрос. Если вы хотите добавить к другому файлу, вы не можете перенаправить онлайн-файл `... | python3 >> другой_файл` или `... | python3 > other_file` перезаписать?
флаг et
Ой, извините, думал только о f.write, но да, это тоже работает, принято.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.