我经常想在 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)应该使用。