Linux 使用placehodler更新文件内容

Linux 使用placehodler更新文件内容,linux,shell,sed,makefile,Linux,Shell,Sed,Makefile,我有以下yaml文件,在其中我想用我已经定义的shell变量替换%IMG\u NAME%,例如$IMG\u NAME 这是输入文件 apiVersion: apps/v1 kind: Deployment metadata: name: app spec: replicas: 1 app: app template: metadata: labels: app: app spec: containers:

我有以下yaml文件,在其中我想用我已经定义的shell变量替换
%IMG\u NAME%
,例如
$IMG\u NAME

这是输入文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  replicas: 1
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
        - name: app
          image: %IMG_NAME%. //this the value to update
          imagePullPolicy: Always
          ports:
            - containerPort: 5000
          resources:
            limits:
              memory: 50Mi
            requests:
              memory: 25Mi
我试着做以下不起作用的事情,你知道吗

sed -e ’s,myimage,’$IMG_NAME',g' < deployment.yaml
sed-e's,myimage,'$IMG_NAME',g'
我不知道你为什么在你的计划中写
更新dep:
。那是什么

不管怎样,也许你只是想这样做:

sed 's/%IMG_NAME%/'"$IMG_NAME"'/g' deployment.yaml
在哪里

  • 重复引用
    $IMG_NAME
    只是一个好习惯
  • -e
    不是必需的
  • 正如评论中指出的那样,使用
    代替
    /
    也是不必要的
并非特定于
sed
,了解以下内容非常重要:

  • 符号
    是一个单引号,而不是您在问题中使用的正确单引号(

  • 如果您有一个实际的
    文件
    要传递给unix
    程序
    (例如
    sed
    awk
    ,以及许多其他文件),您不需要像这样传递它,
    program
    ,因为这些程序中有许多都接受文件名作为命令行参数,所以您可以执行
    程序文件
    。执行此操作时,
    程序
    会知道文件名(当您执行
    程序
    时,它不会知道),并且它也会首先知道它是一个文件(在
    之后,我不明白您想要什么。
    sed
    部署打印到
    标准输出中。yaml
    标准输出中,并且不做任何其他操作。
    我的图像
    不会出现在
    部署中。yaml
    因此不会更改任何内容(是否要替换
    %IMG\u NAME%
    ?)@uzsolt-是的,我想用
    myimage
    value@RaynD,您是否真的试图使用正确的单引号(
    )而不是单引号(
    )?使用逗号(,)而不是斜杠(/)有什么特殊原因吗在替换中?@CRM没有,但是OP似乎喜欢它。但是,是的,也许因为我指定了
    -e
    是不必要的,我也可以添加这个。谢谢,这是有效的。关于如何建议用新值替换/覆盖文件的问题?如果你真的想这样做,你可以使用
    sed
    -I
    选项,或者
    -I.bkp
    创建一个文件名后附加有
    .bkp
    的备份文件。但在确定该命令是否有效之前,不应执行此操作。我尝试了此操作,但出现了错误:
    sed-I's/%IMG_NAME%/'“MG_NAME2”/g'