如何在toml配置文件中使用SED regex



我正在尝试为zsh主题starship创建一个自定义提示,该主题具有可通过.toml文件配置的API。。。

我现在尝试使用的代码是:

[custom.vtex]
command = "cat $HOME/.config/configstore/vtex.json | grep account | sed -n 's/.*:.*"(.*)".*/1/p'"
description = "My custom prompt"
files = [".vtexignore"]
style = "fg:red"

我的.json是:

{
"env": "prod",
"_nextFeedbackDate": "2021-08-17T12:43:59.194Z",
"account": "example",
"workspace": "workspace",
"_lastUsedWorkspace": "master",
"login": "email@email.com",
"token": "eyJhbGciOiJFUzI1NiIsImtpZCI6IkEwRkQ4NDgzNTFG...",
"_lastUsedAccount": "other-account",
"apps": {
...
}
}

猫&grep单独返回这个:

"account": "example",

我试图完成的是提取除example之外的所有内容,以在提示中显示它。问题是我不确定它是否不能在.toml文件中完成,但我得到了这个错误:

[ERROR] - (starship::config): Unable to parse the config file: invalid escape character in string: `:` at line 14 column 83

如果我添加/删除标题字符,则不会显示更多错误,但sed什么也不返回。


编辑:添加de.json作为示例。在您的帮助下,我成功地解决了这个问题,但更改了David的响应,因为我仍然需要转义双引号,因为.toml中的命令位于它们之间。最后我做了这件事,注意到我需要帐户和工作空间,之前没有提到,因为我认为我可以自己解决它(但可能有人可以以更高效/时尚的方式解决它(:

vtex_prompt.sh

#!/usr/bin/zsh
account=$(sed -n -E '/^[[:blank:]]*"account"/s/^[[:blank:]]*[^[:blank:]]+[[:blank:]]"([^"]+)",$/1/p' $HOME/.config/configstore/vtex.json)
workspace=$(sed -n -E '/^[[:blank:]]*"workspace"/s/^[[:blank:]]*[^[:blank:]]+[[:blank:]]"([^"]+)",$/1/p' $HOME/.config/configstore/vtex.json)
echo "$account/$workspace"

starship.toml

[custom.vtex]
command = "zsh ~/vtex_prompt.sh"
description = "VTEX Prompt"
files = [".vtexignore"]

您可以从上面的字符串中提取"example"(不带引号(,而不考虑带有替换和反向引用的行中的前导空格。将扩展正则表达式与-E选项一起使用将减少所需的''转义次数。使用[[:blank:]]来匹配空白将匹配所有类型的空白。

把它放在一起你可以做:

sed -E 's/^[[:blank:]]*[^[:blank:]]+[[:blank:]]"([^"]+)",$/1/'

这假定您的cat/grep输出以','结尾,后面没有空格。(如有调整(

示例使用/输出

$ echo '    "account": "example",' |
> sed -E 's/^[[:blank:]]*[^[:blank:]]+[[:blank:]]"([^"]+)",$/1/'
example

如果这是你的意图,或者我误解了你的需求,请告诉我。如果您对sed表达式有进一步的问题,请告诉我。

正如@WiktorStribiżew所指出的,您应该能够摆脱catgrep,并将sed单独与一起使用

sed -n -E '/^[[:blank:]]*"account"/s/^[[:blank:]]*[^[:blank:]]+[[:blank:]]"([^"]+)",$/1/p'

其中-n抑制图案空间的正常打印,并且在提取和打印之前s/find/replace/定位以"account"..开始的行之前的/^[[:blank:]]*"account/。这会让事情更有效率。

最新更新