110 lines
4.5 KiB
Markdown
110 lines
4.5 KiB
Markdown
# Multini
|
|
|
|
[![build](https://github.com/GenZmeY/multini/workflows/build/badge.svg)](https://github.com/GenZmeY/multini/actions?query=workflow%3Abuild)
|
|
[![tests](https://github.com/GenZmeY/multini/workflows/tests/badge.svg)](https://github.com/GenZmeY/multini/actions?query=workflow%3Atests)
|
|
[![CodeQL](https://github.com/GenZmeY/multini/workflows/CodeQL/badge.svg)](https://github.com/GenZmeY/multini/security/code-scanning)
|
|
[![GitHub go.mod Go version](https://img.shields.io/github/go-mod/go-version/GenZmeY/multini)](https://golang.org)
|
|
[![GitHub](https://img.shields.io/github/license/genzmey/multini)](LICENSE)
|
|
[![GitHub release (latest by date)](https://img.shields.io/github/v/release/GenZmeY/multini)](https://github.com/GenZmeY/multini/releases)
|
|
|
|
*Command line utility for manipulating ini files with duplicate key names.*
|
|
|
|
A compiled version of multini is available on the [release page](https://github.com/GenZmeY/multini/releases).
|
|
|
|
***
|
|
|
|
# Description
|
|
Some programs use ini file format with duplicate key names.
|
|
For example, these are games based on the [unreal engine](https://en.wikipedia.org/wiki/Unreal_Engine).
|
|
It might look like this (part of the Killing Floor 2 config):
|
|
```
|
|
[OnlineSubsystemSteamworks.KFWorkshopSteamworks]
|
|
ServerSubscribedWorkshopItems=2267561023
|
|
ServerSubscribedWorkshopItems=2085786712
|
|
ServerSubscribedWorkshopItems=2222630586
|
|
ServerSubscribedWorkshopItems=2146677560
|
|
```
|
|
Most implementations only support having one property with a given name in a section. If there are several of them, only the first (or last) key will be processed, which is not enough in this case. multini solves this problem.
|
|
|
|
**note:**
|
|
- multini is case sensitive;
|
|
- quotes around the value are not processed (they are part of the value for multini);
|
|
- multi-line values are not supported.
|
|
(but this may change in the future)
|
|
|
|
# Build & Install (Manual)
|
|
1. Install [golang](https://golang.org), [git](https://git-scm.com/), [make](https://www.gnu.org/software/make/);
|
|
2. Clone this repo: `git clone https://github.com/GenZmeY/multini`
|
|
3. Go to the source directory: `cd multini`
|
|
4. Build: `make`
|
|
5. Install: `make install`
|
|
|
|
# Usage
|
|
```
|
|
Usage: multini [OPTION]... ACTION ini_file [section] [key] [value]
|
|
Actions:
|
|
-g, --get Get values for a given combination of parameters.
|
|
-s, --set Set values for a given combination of parameters.
|
|
-a, --add Add values for a given combination of parameters.
|
|
-d, --del Delete the given combination of parameters.
|
|
-c, --chk Display parsing errors for the specified file.
|
|
|
|
Options:
|
|
-e, --existing For --set and --del, fail if item is missing.
|
|
-r, --reverse For --add, adds an item to the top of the section
|
|
-i, --inplace Lock and write files in place.
|
|
This is not atomic but has less restrictions
|
|
than the default replacement method.
|
|
-o, --output FILE Write output to FILE instead. '-' means stdout
|
|
-u, --unix Use LF as end of line
|
|
-w, --windows Use CRLF as end of line
|
|
-q, --quiet Suppress all normal output
|
|
-h, --help Write this help to stdout
|
|
--version Write version to stdout
|
|
```
|
|
|
|
# Examples
|
|
**output a global value not in a section:**
|
|
`multini --get ini_file '' key`
|
|
|
|
**output section:**
|
|
`multini --get ini_file section`
|
|
|
|
**output list of existing sections:**
|
|
`multini --get ini_file`
|
|
|
|
**output value:**
|
|
`multini --get ini_file section key`
|
|
- if there are several keys, a list of all values of this keys will be displayed
|
|
|
|
**create/update a single key:**
|
|
`multini --set ini_file section key value`
|
|
- if there is no key, it will be added
|
|
- if the key exists, the value will be updated
|
|
- if the key exists and has several values, the key with the specified value will be set, the rest of the values will be deleted
|
|
|
|
**add a key with specified value:**
|
|
`multini --add ini_file section key value`
|
|
- if there is no key, it will be added
|
|
- if the key exists and does not have the specified value, the new value will be added
|
|
- if the specified value repeats the existing one, no changes will be made
|
|
|
|
**delete all keys with specified name:**
|
|
`multini --del ini_file section key`
|
|
|
|
**delete a key with specified name and value:**
|
|
`multini --del ini_file section key value`
|
|
|
|
**delete a section:**
|
|
`multini --del ini_file section`
|
|
|
|
**short options can be combined:**
|
|
`multini -gq ini_file section key value`
|
|
- check the existence of a key with a given value using the return code
|
|
|
|
# License
|
|
Copyright © 2020 GenZmeY
|
|
|
|
The content of this repository is licensed under [MIT License](LICENSE).
|
|
|