将各种配置文件中的 $placeholder 文本替换为 $placeholder 参数

将各种配置文件中的 $placeholder 文本替换为 $placeholder 参数

我束手无策,试图让 sed 为我做这件事,我感觉自己像个白痴。所以我希望有人能有一种更聪明的方法来完成看似非常简单的事情。

文件.conf:

USER: !USER!

脚本.sh:

param=$1
# something to replace !USER! with $param

运行后的file.conf script.sh squirrel

USER: squirrel

答案1

您可以使用该sed命令来实现这一点。假设你file.conf有:

USER: !USER!
USER: !USER2!
USER: !USER
USER: !USER!

在你的script.sh文件中你应该有:

#! /bin/bash

param=$1

sed -i'.bak' "s/\!USER\!/$param/" /path/to/file.conf

通过-i参数,sed 命令将就地编辑文件。是.bak您文件的备份,因此如果您的文件是file.conf,则其备份将为file.conf.bak

用于"s/\!USER\!/$param/"用一个值替换另一个值。例如,\!USER\!/$param意味着 sed 将替换字符串!USER!$param其中 $param 包含您在命令行中指定的字符串)。

最后,如果您运行script.shwith,./script.sh squirrel您将看到file.conf已更改。输出将是这样的:

USER: squirrel
USER: !USER2!
USER: !USER
USER: squirrel

正如您所看到的,只有第一行和最后一行!USER!发生了变化。

警告:

  1. 使用时请确保和sed -i'.bak'之间没有空格。-i.bak
  2. 如果$params变量包含特殊字符,例如\, /&sed命令将失败,因此您必须通过添加前缀 来转义这些字符\。例如,如果您想传递值,'fuzz&'您应该使用'fuzz\&'.
  3. 当您传递字符串时,请script.sh确保使用单引号'而不是双引号"。如果您想使用"并且您的字符串包含该字符`(反引号),或者\您必须使用前缀转义该字符\
./script.sh "fuzz\`" # "fuzz\`" will be "fuzz`"
#or
./script.sh "fuzz\\\\" # "fuzz\\\\" will be "fuzz\"

感谢 frabjous 和 Philippos 的观察。

相关内容