如何自动修改 shell 脚本中的键/值对?

如何自动修改 shell 脚本中的键/值对?

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

相关内容