多行字符串替换标记标签内

多行字符串替换标记标签内

我正在尝试修改httpd.conf文件,允许在/var/www/html目录中覆盖。为了简单起见,我们假设它看起来像这样:

<Directory "/var/www/html">
    # Comment
    AllowOverride none
    # Comment
</Directory>

尝试替换AllowOverride noneAllowOverride 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忽略换行符,即加载整个文件。插入符号指示的两个?必须消失。并且,请注意,他们"不需要逃避\(但这不会造成伤害)。

相关内容