使用shell脚本替换文件中的字符串

时间:2011-12-13 09:37:12

标签: bash shell

假设我的文件a.conf如下

Include /1
Include /2
Include /3

我想用新行替换“Include / 2”,我在.sh文件中编写代码:

line="Include /2"
rep=""
sed -e "s/${line}/${rep}/g" /root/new_scripts/a.conf

但是在运行sh文件之后,它给了我以下错误

sed: -e expression #1, char 14: unknown option to `s' 

4 个答案:

答案 0 :(得分:14)

如果您使用的是较新版本的sed,则可以使用 -i 来读取和写入同一文件。使用 -i ,您可以指定文件扩展名,以便进行备份,防止出现问题。除非您使用多个命令,否则您不需要使用 -e 标志

sed -i.bak "s/${line}/${rep}/g" /root/new_scripts/a.conf

我刚刚注意到,由于您使用的变量是带引号的字符串,您可能希望在sed表达式周围使用单引号。您的字符串也包含正斜杠,以避免任何错误,您可以在sed命令中使用不同的分隔符(分隔符不需要是斜杠):

sed -i.bak 's|${line}|${rep}|g' /root/new_scripts/a.conf

答案 1 :(得分:3)

您必须将更改写入新文件,然后将新文件移到旧文件上。像这样:

line="Include 2"

rep=""

sed -e "s/${line}/${rep}/g" /root/new_scripts/a.conf > /root/new_scripts/a.conf-new

mv /root/new_scripts/a.conf-new /root/new_scripts/a.conf

答案 2 :(得分:3)

重定向(> /root/new_scripts/a.conf)会在sed看到之前擦除文件内容。

您需要将-i选项传递给sed以便就地编辑文件:

sed -i "s/${line}/${rep}/g" /root/new_scripts/a.conf

您也可以要求sed创建原始文件的备份:

sed -i.bak "s/${line}/${rep}/g" /root/new_scripts/a.conf

答案 3 :(得分:0)

因此,如果您必须替换文件中的子字符串,可以像这样使用 sed 命令,假设我们有一个文件为 file.txt,因此可以像这样替换其中的子字符串

searchString="abc";
replaceString="def";
sed -i '' "s|$searchString|$replaceString|g" file.txt
<块引用>

这将在 file.txt 中出现“abc”和“def”。此外,这会检查所用变量中存在的任何 / 字符,并且不制作备份文件。