替换 vdf 文件的一部分

替换 vdf 文件的一部分

我再次尝试通过脚本更改配置文件。

我查看了 jq 但 jq 似乎仅支持 .json 格式。

.vdf 几乎与 .json 完全相同,只是没有逗号。

这是我想做的但使用 sed 的尝试。

#!/bin/bash

text_to_find='                  "9420"
                    {
                        "LastPlayed"        ".*"
                    }'
text_to_put='                   "9420"
                    {
                        "LastPlayed"        "1554153269"
                        "ViewedLaunchEULA"      "1"
                        "ViewedSteamPlay"       "1"
                        "BadgeData"     "02000000080b"
                        "LaunchOptions"     "PROTON_NO_ESYNC=1, PROTON_DUMP_DEBUG_COMMANDS=1 %command%"
                    }'
sed -i "s|$text_to_find|$text_to_put|1" myTestFile 

返回:“sed:-e表达式#1,字符13:未终止的‘s’命令”

它可能无法匹配上次播放的内容,因为我认为在这种情况下“.*”仍然不会被解释。

这是测试文件的示例:

https://pastebin.com/qFcEhTEf

答案1

解决这个问题的一种方法是使用多个sed步骤来消除所有双引号。

在第一个中,您将目标文件中的所有双引号替换为标记字符,例如@.它必须是保证不会出现在原件中的字符或字符串。

然后,您将使用源字符串和目标字符串(如原始字符串)进行替换,但所有引号都替换为两个字符串中的标记字符。

最后,您将用双引号替换所有标记字符。

至于.*,这是一种鱼与熊掌兼得的情况。如果它没有被引用,bash就会吃掉它,如果它被引用,sed则会将其视为文字。您可能必须使用正则表达式重写此部分,该正则表达式将在 中被引用bash但在 中生效sed

这就是为什么我说它可能会更容易awk。 ;)尤其是最后一部分!

相关内容