我正在尝试修改httpd.conf
文件,允许在/var/www/html
目录中覆盖。为了简单起见,我们假设它看起来像这样:
<Directory "/var/www/html">
# Comment
AllowOverride none
# Comment
</Directory>
尝试替换AllowOverride none
为AllowOverride All
.
我尝试过这样的事情:
sed -i 's/\(Directory \"\/var\/www\/html\">.*?\)AllowOverride none\(.*?<\/Directory>\)/\1AllowOverride all\2/' httpd.conf
它看起来不像捕获多行,所以我尝试了其他一些东西,例如正则表达式修饰符和这个:https://www.gnu.org/software/sed/manual/html_node/Text-search-across-multiple-lines.html 但无法匹配所需的字符串。
人们会如何去做这件事呢? sed 之外的解决方案也受到欢迎。
答案1
我假设您想要的只是替换AllowOverride none
该<Directory "/var/www/html">
块中的特定内容,而不是其他地方。我们能做到这一点。
简洁版本:
sed -i '/^<Directory "\/var\/www\/html">/,/^<\/Directory>/ {
s/AllowOverride none/AllowOverride all/;
}' httpd.conf
这表示仅在指定行之间应用替换命令。
请记住先备份您的文件,然后diff
再备份以确认您获得了所需的内容。 :)
答案2
sed
是一个 *nix 文本工具,是基于行的。要在多行上工作,您需要采取某些措施。为什么不
sed 's/AllowOverride none/AllowOverride all/' file
满足您的需求吗?
编辑:或者,如果您只想更改“目录”段落中的字符串,
sed '/<Directory "\/var\/www\/html">/,/<\/Directory>/ s/AllowOverride none/AllowOverride all/' file
编辑:通过三个小调整,您可以使自己的脚本正常工作:
sed 's/\(Directory \"\/var\/www\/html\">.*?\)AllowOverride none\(.*?<\/Directory>\)/\1AllowOverride all\2/' file
sed -z 's/\(Directory \"\/var\/www\/html\">.*\)AllowOverride none\(.*<\/Directory>\)/\1AllowOverride all\2/' file
^ ^ ^
-z
(--null-data,用 NUL 字符分隔行;参见man sed
)sed
忽略换行符,即加载整个文件。插入符号指示的两个?
必须消失。并且,请注意,他们"
不需要逃避\
(但这不会造成伤害)。