我正在将一些命令写入一些关于如何配置 NGINX 的文档中。我不想写“使用 vi 打开它”并期望有人知道所有这些,我只想说运行这个 sed 命令。
这是我第一次使用 sed。
该文件包含一个条目
server {
{{{{{{OTHER STUFF}}}}}}}
root /var/www/html;
{{{{{{MORE STUFF}}}}}}
}
我想将其替换为/var/www
并删除html
.
我正在与斜线和嵌套作斗争。文件中还有“root”一词的其他实例。
这不起作用
sed -i 's//var/www/html//var/www/g' default
答案1
sed
对GNU 的命令使用不同的分隔符sed
允许使用。您可以使用任何您知道不会出现在模式中的分隔符;要不然你应该逃避/
或任何其他特殊字符。
sed 's% /var/www/html% /var/www%' default
另外,较新的 GNUsed
在使用选项时确实支持就地替换-i
。对于 MAC 和 FreeBSD 用户,他们应该使用-i ''
。
您还可以使用此-i.back
选项获得备份,它将在其中创建文件的副本default.back
。
答案2
sed
可以使用任意字符作为模式分隔符:
sed -i 's#root /var/www/stuff#root /var/www#' somefile
该g
修饰符在这里毫无用处,因为您预计每行不会有多个匹配项。
为了便携性:
sed 's#root /var/www/stuff#root /var/www#' somefile >newfile && mv newfile somefile
至于您的文档,只需说“在编辑器中更改此行”即可。如果他们正在设置 nginx,他们应该知道如何使用编辑器,或者人们希望如此。
一般来说,更改配置文件中的内容(如果只是一次性编辑)手动完成时不太容易出错。这样,您就不会冒着组装不当的正则表达式失控并以非预期方式更改内容的风险。
答案3
sed -i 's/\/var\/www\/html/\/var\/www/g' filename.txt
不过,我愿意接受更好的答案。