【问题标题】:Replace String with Shell script [duplicate]用Shell脚本替换字符串[重复]
【发布时间】:2016-09-03 01:41:00
【问题描述】:

我正在尝试从 shell 中替换一个字符串。我已经阅读了字符串,它在模板变量中。现在我试图用在shell中传递的参数替换存储在REPLACE_COMPANY变量中的companyId。我尝试了一些来自网络的解决方案,但没有成功。另外我想保持文件格式不变,因为我发现所有字符串都放在一行中。谁能帮忙。

REPLACE_COMPANY="companyId" 
echo "$template" 
##### Company: companyId CONFIG  START #####

backend FE:spaces-companyId
        redirect scheme https if !{ ssl_fc }
        balance roundrobin
        server 1-www spacesIp:80 check cookie s2

backend BE:synapse-companyId
         redirect scheme https if !{ ssl_fc }
         balance roundrobin
         server 1-www synapseIp:8008 check cookie s2

##### Company: companyId CONFIG  END ##### 

【问题讨论】:

  • 令人困惑。你只需要 sed -i "/companyld/\$template/ filename 所以你最终得到 REPLACE_COMPANY="$template" 吗?这是你的目标吗?
  • 你能提供预期的结果吗?
  • 嗨,预期的刺激是,所有提到 companyId(在 $REPLACE_COMPANY 中声明)的文本(在 $template 中可用)都将替换为我在 shell 的 $1 中传递的参数,并将存储在又变了。格式也将保持不变。我不想先将其直接写入任何文件,因为需要完成其他工作。

标签: shell


【解决方案1】:

您可以使用envsubst 将文件中的变量引用替换为当前shell 中可用的值。例如:

$ cat test.template
Hi $USER
$ envsubst < test.template
Hi username

【讨论】:

    【解决方案2】:

    这是从我这边完成的。请在下面找到代码。感谢所有帮助。

    注意: INF 包含文件名,其中包含需要修改和回写的模板。 $FILE 包含需要写入最终输出的位置。

    provision(){
       INF="proxy.template"
       REPLACE_COMPANY="companyId"
       REPLACE_SPACEIP="spacesIp"
       REPLACE_SYNAPSEIP="synapseIp"
       sed -e "s/$REPLACE_COMPANY/$1/g" -e "s/$REPLACE_SPACEIP/$2/g" -e "s/$REPLACE_SYNAPSEIP/$3/g" $INF > $1
       cat $1 >> $FILE
       rm $1
    }
    

    【讨论】:

    • 如果您要替换的任何字符串中的字符不能转换为正则表达式,或者您的替换字符串包含/s,这将不起作用。
    • 参见 BashFAQ #21 -- mywiki.wooledge.org/BashFAQ/021 -- 以获得更可靠的替代方案。
    猜你喜欢
    • 2015-05-05
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多