如何转义Fish shell变量以用作awk模式?
我正在编写一个函数来列出给定docker存储库中的最新图像:如何转义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
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"