我正在尝试为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所指出的,您应该能够摆脱cat
和grep
,并将sed
单独与一起使用
sed -n -E '/^[[:blank:]]*"account"/s/^[[:blank:]]*[^[:blank:]]+[[:blank:]]"([^"]+)",$/1/p'
其中-n
抑制图案空间的正常打印,并且在提取和打印之前s/find/replace/
定位以"account"..
开始的行之前的/^[[:blank:]]*"account/
。这会让事情更有效率。