忽略sed查找和替换命令中的斜杠

4
我正在尝试在终端中使用sed进行查找和替换。
在apache配置文件中,我正在尝试替换: DocumentRoot /var/www
DocumentRoot /var/www/mysite.com/public_html
而不使用编辑器从命令行完成。 我想使用sed实现这一点,并尝试了各种迭代版本: sudo sed -i 's/'DocumentRoot /var/www'/'DocumentRoot /var/www/mysite.com/public_html'/' /etc/apache2/sites-available/mysite.com 但是当这样做时,我会得到以下错误: sed: -e expression #1, char 14: unterminated s command
因此,它在路径中的斜杠上出错了。 我该如何解决这个问题?
感谢您的帮助。

可能是重复的问题:Sed - unknown option to `s' - tripleee
请注意,在您的Apache配置文件中,通常会有一个指令,如:<Directory "/var/www">...一些选项...</Directory>,您也需要在那里更改路径。 - eminor
2个回答

10

在正则表达式中,并不一定需要使用 / 作为分隔符,如果你的正则表达式中包含有需要转义的 /,你可以使用 # 或者 @ 作为分隔符。

sed -i s#expr1#expr2#

所以,它可能是这样的:
sudo sed -i 's#DocumentRoot /var/www#DocumentRoot /var/www/mysite.com/public_html#' /etc/apache2/sites-available/mysite.com

此外,由于您的替代参数本身包含空格,因此需要用单引号将其括起来。


对你的代码进行了微小的修改,现在可以使用:sudo sed -i 's#DocumentRoot /var/www#DocumentRoot /var/www/mysite.com/public_html#' /etc/apache2/sites-available/mysite.com - majordomo
@gcubed 看起来我把定界符放错了位置,不符合你的要求。很高兴它能正常工作 :) - Anirudh Ramanathan

4

sed 中,使用 / 作为分隔符并非强制要求。 sed 's/hi/hey/sed 's#hi#hey#' 是等价的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接