我收到一份操作系统列表,每行一个,例如:
alpine/3.13
alpine/edge
alt/Sisyphus
alt/p9
apertis/v2019.5
我需要将每一行按摩成两个参数以产生:
lxc launch images:alpine/3.13 alpine-3-13
lxc launch images:alpine/edge alpine-edge
lxc launch images:alt/Sisyphus alt-Sisyphus
lxc launch images:alt/p9 alt-p9
lxc launch images:apertis/v2019.5 apertis-v2019-5
然后运行这些命令。请注意,第二个参数已将所有非字母数字切换为连字符。我想出了以下内容:
echo alpine/3.13 | sed 'h;s#[/.]#-#g;x;G;s/\n/ /' | xargs -ti lxc launch images:{}
不幸的是,虽然 xargs 运行的命令看起来是正确的,但 xargs 没有将两个参数传递给 lxc,而是将整个内容作为单个参数传递,因此 lxc 尝试下载名为“alpine/3.13 alpine-3-13”的图像,而不是下载名为 alpine/3.13 的映像并使用它创建一个名为 alpine-3-13 的容器。
有没有办法传递 lxc 两个单独的参数?
示例输出:
# echo alpine/3.13 | sed 'h;s#[/.]#-#g;x;G;s/\n/ /' | xargs -ti lxc launch images:{}
lxc launch images:alpine/3.13 alpine-3-13
Creating the instance
Error: Failed instance creation: The requested image couldn't be found
# lxc launch images:alpine/3.13 alpine-3-13
Creating alpine-3-13
Starting alpine-3-13
<works correctly>
根据来自 KamilCuk 和 markp-fuso 的以下输入完成(工作)最终命令:
lxc image list images: | grep -v cloud | grep -Po '^\| \K[^ ]+(?=.+x86_64.+CONTAINER)' | sed 'h;s#[^[:alnum:]]#-#g;x;G;s/\n/ /;s/^ */images:/' | xargs -n2 lxc launch