`sed` 正则表达式错误

`sed` 正则表达式错误

我正在尝试编写一个别名来获取 docker 容器的 IP。命令如下:

docker inspect redis | grep IPAddress | awk 'NR==3{ print $2 }' | sed 's/[^"]*"\([^"]*\)".*/\1/'

如果我从命令行启动它,它可以正常工作。然后我将其插入bash_aliases

alias redis-ip="docker inspect redis | grep IPAddress | awk 'NR==3{ print $2 }' | sed 's/[^"]*"\([^"]*\)".*/\1/'"

但是当我启动时,redis-ip我收到此错误:

sed: -e expression #1, char 19: invalid reference \1 on `s' command's RHS

任何人都可以告诉我错误是什么?

答案1

为此,请使用 shell 函数而不是别名:

function redis-ip {
  docker inspect redis |
  grep IPAddress |
  awk 'NR == 3 { print $2 }' |
  sed 's/[^"]*"\([^"]*\)".*/\1/'
}

如果它sed符合您的要求,我不知道,因为我不知道该docker命令输出什么。

答案2

问题是您的别名用双引号 ( ") 括起来。这意味着脚本$2中的awk被传递到 shell,而不是传递到 shell awk,并且命令中的双引号sed会搞乱您的别名。如果您这样做,您的别名应该按预期工作:

alias redis-ip="docker inspect redis | grep IPAddress | awk 'NR==3{print \$2 }' | sed 's/[^\"]*\"\([^\"]*\)\".*/\1/'"

可能更好而且更简单使用函数尽管。

答案3

通常,我会说“如果你想从 json 解析或提取数据,请使用 jq 或 jsonpipe 或类似的”,但该docker inspect命令已经具有内置的输出格式和字段提取。

您可以告诉docker inspect只返回您感兴趣的字段,例如

alias redis-ip="docker inspect -f '{{.NetworkSettings.IPAddress}}' redis"

或者

alias redis-ip='docker inspect -f '\''{{.NetworkSettings.IPAddress}}'\'' redis'

这是(简洁地)记录在https://docs.docker.com/engine/reference/commandline/inspect/

也可以看看检查时要检查什么了解更多详细信息和示例。和Docker 检查模板魔法是另一篇博客文章,很好地概述了 docker 检查输出格式的可能性,以及几个更有用的示例。

相关内容