我需要在这样的逻辑中将键/值对值附加到文件中。
例如,该文件已经包含这样的值:
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 将按数字顺序输出键。