我需要在此類邏輯中將一個鍵/值對值附加到文件中。如何僅在一個unix命令中將唯一鍵/值對添加到本地文件中?
例如,文件中包含這樣的價值已經:
key1=value1
key2=value2
,如果新的對是key3=value3
,它會被追加,但如果是key1=value4
,現有一個將被更新。
這樣的事情可以在一個unix命令中完成嗎?
我需要在此類邏輯中將一個鍵/值對值附加到文件中。如何僅在一個unix命令中將唯一鍵/值對添加到本地文件中?
例如,文件中包含這樣的價值已經:
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
你也許可以這樣做,也是無 a &&
通過使用in-place 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單倍行距,因爲這就是加入喜歡。 海綿來自Debian的moreutils包。的另一個優勢加入是,如果第一輸入我們鍵6,再後來KEY5,加入輸出以數字順序的鍵。
行間必須有空行嗎? – agc