![如何自动修改 shell 脚本中的键/值对?](https://linux22.com/image/1292677/%E5%A6%82%E4%BD%95%E8%87%AA%E5%8A%A8%E4%BF%AE%E6%94%B9%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E7%9A%84%E9%94%AE%2F%E5%80%BC%E5%AF%B9%EF%BC%9F.png)
我经常想在 shell 脚本中自动执行此类任务:
如果行:
SOMEKEY=SOMEVALUE
存在于文件中,然后将其更改为
SOMEKEY=SOMEOTHERVALUE
否则,将该行附加到SOMEKEY=SOMEOTHERVALUE
文件中。
我该怎么做?我想我可以结合使用grep
和来完成此操作sed
,但我确信这是一个很常见的任务,有人已经想出了一个优雅的解决方案。
顺便说一下,替换时我通常会这样做
sed -i 's/old/new/g' fname
但这意味着我在编写正则表达式时必须非常小心,以免犯错误。有没有一种简单的方法可以“预览”我调用后会发生哪些变化,而sed
无需实际踩踏文件?
答案1
我将使用 awk 来完成这项任务:
awk -F'=' -v "keyname=$SOMEKEY" -v "value=$SOMEOTHERVALUE" '
$1 == keyname {
if ($2 != value) $2 = "\"" value "\""
key_found = 1
}
{ print $1 "=" $2 }
END { if (!key_found) print keyname "=\"" value "\"" }
' fname
假设
SOMEKEY=key1
SOMEOTHERVALUE="John Doe is dead!"
并给出以下输入:
key1="John Doe is geat!
key2="Who's John Wayne?"
一个人得到:
key1="John Doe is dead!"
key2="Who's John Wayne?"
或者如果没有key1
行,key1="John Doe is dead!"
则将其附加到末尾。
笔记:在 Solaris 或其他 UNIX 衍生版本上,仍然提供旧版本的awk(1),瑙克(1)应该使用。