如何在一个 UNIX 命令中将唯一的键/值对追加到本地文件中



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

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

key1=value1
key2=value2

如果新对key3=value3,它将被附加,但如果它是key1=value4,现有的将被更新。

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

这取决于你所说的"命令"是什么意思。UNIX 命令可以是串在一起的简单命令的任意长流水线/序列。

那么有很多方法可以做到这一点,例如:

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

以下文字记录显示了此操作:

pax> printf 'nkey1=value1nkey2=value2nkey3=value3n' | awk '
...> BEGIN    {s="key2=something_elsen"}
...> /^key2=/ {printf s;s="";next}
...>          {print}
...> END      {printf s}'
key1=value1
key2=something_else
key3=value3
pax> printf 'nkey1=value1nkey2=value2nkey3=value3n' | awk '
...> BEGIN    {s="key4=something_newn"}
...> /^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

注意:我从键开始.txt单行距,因为这是加入的首选。 sponge 来自 Debian 的 moreutils 软件包。 join 的一个附带好处是,如果我们首先输入 key6,然后输入 key5,join 将按数字顺序输出键。

最新更新