Как добавить уникальную пару ключ / значение в локальный файл только одной командой unix?

Мне нужно добавить значение пары ключ / значение в файл, в такой логике.

Например, файл уже содержит такое значение:

key1=value1

key2=value2

и если новая пара key3=value3, он будет добавлен, но если это было key1=value4существующий будет обновлен.

Можно ли это сделать в ОДНОЙ команде unix?

2 ответа

Это зависит от того, что вы подразумеваете под "командой". Команда UNIX может быть произвольно длинным конвейером / последовательностью более простых команд, соединенных вместе.

Есть несколько способов сделать это, например:

awk '
    BEGIN    { s = "key1=value\n" }
    /^key1=/ { printf s; s = ""; next }
             { print }
    END      { printf s }
    ' infile >outfile && mv outfile infile

Следующая стенограмма показывает это в действии:

pax> printf '\nkey1=value1\nkey2=value2\nkey3=value3\n' | awk '
...> BEGIN    {s="key2=something_else\n"}
...> /^key2=/ {printf s;s="";next}
...>          {print}
...> END      {printf s}'

key1=value1
key2=something_else
key3=value3

pax> printf '\nkey1=value1\nkey2=value2\nkey3=value3\n' | awk '
...> BEGIN    {s="key4=something_new\n"}
...> /^key4=/ {printf s;s="";next}
...>          {print}
...> END      {printf s}'

key1=value1
key2=value2
key3=value3
key4=something_new

Вы могли бы также сделать это без && соединение с использованием на месте sed редактирование за счет (возможно) более сложной команды.

Не в одной команде, а в одной строке (хотя и завернутые в слова ниже), первое обновление 'key1':

echo  "key1=value4" | join -t '=' -j 1 -a 1 -a 2 keys.txt - \
    | sed 's/=[^=]*=/=/' | sponge keys.txt
cat keys.txt

Выход:

key1=value4
key2=value2

Добавьте 'key3':

echo  "key3=value3" | join -t '=' -j 1 -a 1 -a 2 keys.txt - \
    | sed 's/=[^=]*=/=/' | sponge keys.txt
cat keys.txt

Выход:

key1=value4
key2=value2
key3=value3

Примечания: я начал с keys.txt с одинарным интервалом, поскольку это то, что предпочитает соединение. sponge из пакета moreutils Debian. Дополнительное преимущество объединения заключается в том, что если сначала мы введем ключ 6, а затем ключ 5, объединение выводит ключи в числовом порядке.

Другие вопросы по тегам