【发布时间】:2021-03-15 22:32:23
【问题描述】:
我正在为 Kubernetes 编写一些部署脚本,并希望使用 sed 执行单个命令来替换 yaml 文件中的一些“模板变量”。
我有以下(例如,缩短的 yaml 文件)输入文件,我想在其中进行替换:
输入.txt
CONTAINER_ADDITIONAL
spec:
selector:
app: CONTAINER_NAME
type: NodePort
ports:
- protocol: TCP
port: EXPOSED_PORT
另外,我有以下 Dockerfile,我想从中获取 EXPOSE 端口号以插入到 EXPOSED_PORT:
Dockerfile
FROM node:latest
EXPOSE 3000
WORKDIR /app
我现在尝试使用不同的方法将端口号 3000(来自 Dockerfile)插入到 EXPOSED_PORT
(CONTAINER_NAME 和 CONTAINER_ADDITIONAL 正在工作,它们位于示例文件中,以便使用以下命令完成)。
以下命令可以直接在shell中执行并给出想要的结果(3000):cat Dockerfile | grep EXPOSE | cut -d" " -f2 -> 可能还有\ncat Dockerfile | grep EXPOSE | cut -d" " -f2 | tr -d "\n" -> 前面提到过\n 已移除grep EXPOSE Dockerfile | cut -d" " -f2 -> 带有 \ngrep EXPOSE Dockerfile | cut -d" " -f2 | tr -d "\n" -> 不带有 \ngrep EXPOSE Dockerfile | awk '{print $2}' -> 带有 \n,使用单引号 - 不是一个选项?grep EXPOSE Dockerfile|tr -d -c 0-9 -> 不带\n,不首选(当存在多个端口号由空格分隔的情况时)grep -Po "(?<=^EXPOSE )\w*$" Dockerfile -> 带\n,不首选(多个端口号)
grep -Po "(?<=^EXPOSE )\w*$" Dockerfile | tr -d "\n" -> 没有\n
但是:
sed -e 's@CONTAINER_NAME@some-container-name@g;s@CONTAINER_ADDITIONAL@cat some_config.txt@e;s@EXPOSED_PORT@grep EXPOSE Dockerfile | cut -d" " -f2 | tr -d "\n"@e' input.txt
不适用于EXPOSED_PORT。其他两个变量 CONTAINER_NAME 和 CONTAINER_ADDITIONAL 起作用(猫被执行,some_config.txt 的内容被放入其中)
无论上面提到的哪个命令在 shell 中直接运行并给出正确的结果,在 sed 中执行时它们都不起作用(awk 肯定不会,因为单引号)。
我得到的输出是:
inserted_content_of: some_config.txt
some_more_inserted_content_from: some_config.txt
spec:
selector:
app: some-container-name
type: NodePort
ports:
- protocol: TCP
sh: 1: port:: not found
我想要的预期输出:
inserted_content_of: some_config.txt
some_more_inserted_content_from: some_config.txt
spec:
selector:
app: some-container-name
type: NodePort
ports:
- protocol: TCP
port: 3000
我的 sed 命令有什么问题吗?
有什么问题可以解释一下吗?
我该如何解决这个问题?
【问题讨论】:
-
sed -e "s@CONTAINER_NAME@some-container-name@g;s@CONTAINER_ADDITIONAL@$(cat some_config.txt)@e;s@EXPOSED_PORT@$(grep EXPOSE 输入。 txt | cut -d" " -f2 | tr -d \"\n\")@e" input.txt?
-
sed: -e expression #1, char 78: unterminated `s' command甚至在尝试恢复为 sed 的单引号并撤消双引号的转义时。