我束手无策,试图让 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.sh
with,./script.sh squirrel
您将看到file.conf
已更改。输出将是这样的:
USER: squirrel
USER: !USER2!
USER: !USER
USER: squirrel
正如您所看到的,只有第一行和最后一行!USER!
发生了变化。
警告:
- 使用时请确保和
sed -i'.bak'
之间没有空格。-i
.bak
- 如果
$params
变量包含特殊字符,例如\
,/
,&
该sed
命令将失败,因此您必须通过添加前缀 来转义这些字符\
。例如,如果您想传递值,'fuzz&'
您应该使用'fuzz\&'
. - 当您传递字符串时,请
script.sh
确保使用单引号'
而不是双引号"
。如果您想使用"
并且您的字符串包含该字符`
(反引号),或者\
您必须使用前缀转义该字符\
:
./script.sh "fuzz\`" # "fuzz\`" will be "fuzz`"
#or
./script.sh "fuzz\\\\" # "fuzz\\\\" will be "fuzz\"
感谢 frabjous 和 Philippos 的观察。