如何转义Fish shell变量以用作awk模式?

如何转义Fish shell变量以用作awk模式?,awk,docker,fish,Awk,Docker,Fish,我正在编写一个函数来列出给定docker存储库中的最新图像: function docker-latest set repo $argv[1] docker images | awk "/$repo/ && /latest/{print $1}" end 工作很好… 这是docker图像输出 $ docker images REPOSITORY TAG

我正在编写一个函数来列出给定docker存储库中的最新图像:

function docker-latest
      set repo $argv[1]
      docker images | awk "/$repo/ && /latest/{print $1}"
  end
工作很好… 这是
docker图像
输出

$ docker images
REPOSITORY                                       TAG                 IMAGE ID            CREATED             SIZE
coaxisopt_daemon                                 latest              86bd3d602074        17 hours ago        830.7 MB
coaxisopt_daemon                                 v1.0.13             86bd3d602074        17 hours ago        830.7 MB
docker.site.fr:5000/coaxis/coaxisopt_daemon     latest              86bd3d602074        17 hours ago        830.7 MB
<none>                                           <none>              da0e5b0fc2a1        17 hours ago        830.7 MB
docker.site.fr:5000/coaxis/coaxisopt_daemon     <none>              9c0175d7d397        18 hours ago        830.7 MB
…
直到 但是,当我在字符串末尾添加一些
/
(斜杠)字符以过滤推送图像时:

$ docker-latest coaxis/
awk: cmd. line:1: /coaxis// && /latest/{print }
awk: cmd. line:1:           ^ syntax error
问题: 如何转义
repo
变量,以便在
awk
模式中安全地使用它?

解决方案 详细信息:诀窍是将
$repo
通过
awk
的变量
repo
并转义
$1

脏解决方案 使用
sed

echo "coaxis/" | sed 's!/!\\\/!g'
肮脏,因为它不是真正的通用

全功能
如果必须使用
sed
,则将
awk
完全替换为
sed
。对于这种情况,它将更加清晰和快速(sed的情况并不总是如此…)

sed
允许将分隔符更改为
s
命令之后的任何内容。我选择了
#

-n
抑制输出,并且
p
命令仅在匹配时打印


(如果您对
#
有问题,您可以选择任何内容,如
%
,或表达式中不太可能出现的任何内容)

同样的错误,您能否解释一下您试图实现的目标?在我看来,您正在将第一个字段(
$1
)与
$repo
变量进行匹配。诀窍是将
$repo
通过awk变量
v
您不能在“Fish”中使用单引号来分隔脚本,这样您就不必逃过地狱了吗?(我从未听说过鱼,所以我不知道)。好的。。。希望“鱼”已经不见了(我也从来没听说过他)…我不想特别使用sed的可能重复,因为它的语法特别不可读且难以维护。
docker images | awk -v repo="$repo"  '$1 ~ repo && $2 == "latest" {print $1}'
echo "coaxis/" | sed 's!/!\\\/!g'
function docker-latest
      set repo (echo "$argv[1]" | sed 's!/!\\\/!g')
      docker images | awk "/$repo/ && /latest/{print $1}"
  end
sed -n "s#\([^ ]*${repo}[^ ]*\) \+latest.*#\1#p"