如何逃生鱼壳variables用作awk模式?

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

function docker-latest set repo $argv[1] docker images | awk "/$repo/ && /latest/{print $1}" end 

工作正常…

这是docker images输出

 $ 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 coaxisopt_daemon latest 86bd3d602074 17 hours ago 830.7 MB docker.akema.fr:5000/coaxis/coaxisopt_daemon latest 86bd3d602074 17 hours ago 830.7 MB 

直到

但是,当我在string的末尾放置一些/ (斜线)字符来过滤推送的图像时:

 $ docker-latest coaxis/ awk: cmd. line:1: /coaxis// && /latest/{print } awk: cmd. line:1: ^ syntax error 

我如何逃避repovariables,所以我用awk模式安全地使用它?

 docker images | awk -v repo="$repo" '$1 ~ repo && $2 == "latest" {print $1}' 

细节:诀窍是通过awk的variablesrepo传递$repo repo并转义$1

脏解决scheme

使用sed

 echo "coaxis/" | sed 's!/!\\\/!g' 

肮脏,因为它不是真正的通用。

全function

 function docker-latest set repo (echo "$argv[1]" | sed 's!/!\\\/!g') docker images | awk "/$repo/ && /latest/{print $1}" end 

如果你必须使用sed ,那么完全用sedreplaceawk 。 对于这种情况下,它会更清晰和更快(sed不总是这样)

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

 sed -n "s#\([^ ]*${repo}[^ ]*\) \+latest.*#\1#p" 

-n禁止输出, p命令仅在匹配时打印。

(如果#有问题,你可以select任何东西,比如% ,或者expression式中不太可能发生的事情)