如何仅在一个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按数字顺序输出键。行与行之间必须有空行吗?