首页 > 解决方案 > Shell脚本用一个值替换所有出现的字符串

问题描述

我是 shell 脚本的新手。我有一个由 placeholder 组成的 YAML 文件。我需要<test-name>用值 sweta替换所有出现的占位符

脚本.sh

Name="sweta"

下面是 YAML 文件的示例

metadata:
  name: <test-name>-svc
  namespace: abc
spec:
  selector:
    app: <test-name>
  ports:
  - protocol: TCP
    name: http
    port: 80
    targetPort: 8080

我的预期输出是:

metadata:
  name: sweta-svc
  namespace: abc
spec:
  selector:
    app: sweta
  ports:
  - protocol: TCP
    name: http
    port: 80
    targetPort: 8080

有人能帮我吗?

感谢您的所有帮助。提前致谢!

标签: linuxbashshellsh

解决方案


有两种简单的方法可以完成搜索并将<test-name>字符串替换为sweta

注意: 假设您的 yaml 文件名为config.yaml


选项 1:使用流编辑器命令“sed”,如下所示:

覆盖原始文件

sed -i 's/<test-name>/sweta/g' config.yaml

将输出写入不同的文件

sed 's/<test-name>/sweta/g' config.yaml > updated_config.yaml

sed 命令的语法是sed -i 's/original/new/g' file.txt

sed命令名称在哪里

-i代表就地编辑。此选项用于覆盖原始文件。如果您不使用它,则必须将输出重定向到另一个文件,如上面第二个命令中所做的那样。

s代表替代品

original是搜索字符串

new是替换字符串

g用于全局(替换所有出现)。省略它只会替换第一次出现

file.txt是文本文件(Linux 不使用 .txt 之类的扩展名,但人们通常使用此类扩展名命名文件作为表示文件类型的约定)


选项 2:使用“awk”命令:

awk 是一个非常强大的文本处理命令,具有自己的语言语法,但是这种搜索和替换非常简单:

awk '{gsub("<test-name>", "sweta"); print $0}' config.yaml > updated_config.yaml

推荐阅读