假设我的文件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'
答案 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”。此外,这会检查所用变量中存在的任何 / 字符,并且不制作备份文件。