Как добавить уникальную пару ключ / значение в локальный файл только одной командой 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, объединение выводит ключи в числовом порядке.