如何仅在一个unix命令中将唯一的键/值对附加到本地文件中?

如何仅在一个unix命令中将唯一的键/值对附加到本地文件中?,unix,key-value,Unix,Key Value,我需要在这样的逻辑中将一个键/值对值附加到一个文件中 例如,该文件已经包含这样的值: key1=value1 key2=value2 如果新的一对是key3=value3,它将被追加,但是如果它是key1=value4,现有的一对将被更新 这样的事情可以在一个unix命令中完成吗?这取决于您所说的“命令”是什么意思。UNIX命令可以是一个任意长的管道/串在一起的简单命令序列 您可以通过多种方式来实现,例如: awk ' BEGIN { s = "key1=value\n" }

我需要在这样的逻辑中将一个键/值对值附加到一个文件中

例如,该文件已经包含这样的值:

key1=value1

key2=value2
如果新的一对是
key3=value3
,它将被追加,但是如果它是
key1=value4
,现有的一对将被更新


这样的事情可以在一个unix命令中完成吗?

这取决于您所说的“命令”是什么意思。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”:

输出:

key1=value4
key2=value2
key1=value4
key2=value2
key3=value3
添加“键3”:

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
key1=value4
key2=value2
key3=value3

注意:我从keys.txt开始使用单间距,因为这是join更喜欢的海绵来自Debian的moreutils包装。join的一个附带好处是,如果先输入键6,然后输入键5,join按数字顺序输出键。

行与行之间必须有空行吗?