【问题标题】:grep command to replace multiline text from httpd.conf file on Fedoragrep 命令替换 Fedora 上 httpd.conf 文件中的多行文本
【发布时间】:2010-10-20 00:24:22
【问题描述】:

我是 shell 脚本和 Linux 环境的新手。

在我的项目中,我试图从 httpd.conf 文件中搜索以下文本

<Directory '/somedir/someinnerdir'>
AllowOverride All
</Directory>

然后删除此文本并再次重写相同的文本。 进行此重写的原因是该脚本将在第一次安装 Web 应用程序时运行,但它可能会在一段时间后再次运行,因为该 shell 脚本的其他部分也在执行其他任务。所以第一次找不到这个文本,只会被写入,但稍后在运行脚本时会再次找到这个文本,需要删除并再次写入。

所以我试图实现这一点的脚本部分类似于:

grep -ve "<Directory '/somedir/someinnerdir'>\\nAllowOverride All\\n</Directory>" /etc/httpd/conf/httpd.conf > tmp_direct

echo -e "<Directory '/somedir/someinnerdir'>\\nAllowOverride All\\n</Directory>" >> tmp_direct

mv tmp_direct /etc/httpd/conf/httpd.conf

我目前没有代码,所以上面可能有一些语法错误,但逻辑/编码是相同的。

由于 grep 命令不支持多行搜索,上述代码片段无法实现我想要实现的目标。

我的操作系统是 Fedora 8。

您能否在此代码中提出一些建议以实现所需或可能是其他替代方案。

我们将非常感谢您在这方面的任何帮助。

提前致谢。


感谢您的回复。

抱歉之前的错误代码。现在更正了。

Charlie 和 i-moan,由于可操作性限制,我将无法实现 sed 或 perl,因为它需要添加到我们将分发此项目的环境中。

史蒂夫,我想检查多行。我没有把它放在代码块中,所以它删除了目录标签。 :(

所以我得另谋出路。

再次感谢。

最好的问候。

【问题讨论】:

  • 对我不好。抱歉提交了没有代码块的上一篇文章。所以它删除了目录标签。请找到正确的帖子和代码。

标签: grep fedora multiline httpd.conf


【解决方案1】:

如果您想确保匹配整行,您可以执行以下操作: grep -v "^AllowOverride All$"

^ 匹配行首,$ 匹配行尾。

这有帮助吗?我不太清楚你想用 grep 做什么。

【讨论】:

    【解决方案2】:

    这听起来像是sed(1) 的工作。你想要的会很接近

    sed -i.bak -e '/AllowOverride All/i# '  file
    

    注释掉该行(记住 httpd.conf 有 cmets),然后是

    sed -i.bak -e 's/# AllowOverride All/AllowOverride All '  file
    

    将其退回。

    警告我没试过,你想阅读手册页并自己测试。

    【讨论】:

      【解决方案3】:

      我不确定我是否理解这个问题。 如果我错了,请纠正我,但您在第一次运行脚本时尝试将“AllowOverride All”添加到 httpd.conf。如果是这样,您要启用它吗?

      那么在第二遍时,您可能想要启用/禁用该命令?

      如果我没记错的话 'AllowOverride' 只允许在 部分中所以只有在 中添加/启用才有意义定义:

      如果上述情况属实,您可以在 perl 中执行此操作..

      第一次运行:添加

      perl -0777 -pi -e 's{(.?(?!AllowOverride\s+All).?)}[\nAllowOverride 所有\n$1]ixgs的httpd.conf

      仅当目录部分尚未包含“AllowOverride All”时,它才会将其添加到目录部分。

      第二次运行:改变

      在第二次运行时,您可以按照查理的建议注释掉..或者如果您喜欢 perl

      perl -0777 -pi -e's{(.?)(AllowOverride\s+All)(.?)}[$1#$2$3]ixgs' httpd.conf

      评论

      perl -0777 -pi -e's{(.?)(#AllowOverride\s+All)(.?)}[$1AllowOverride\s+All$3]ixgs' httpd.conf

      正则表达式 s{}[] 非常冗长,并且有更好的正则表达式可以做同样的事情,但这对于初学者来说更容易(希望)理解:)。

      perl 命令选项说明

      -0777 强制 Perl 一次性读取整个文件,因为 0777 不是合法字符值

      -p 在您的脚本周围放置一个循环

      -i 允许您就地编辑文件(因此您在 '-e' 中的命令会更改文件)

      -e 让您在命令行上指定一行代码

      在那一行中,我们有一个正则表达式。有关这方面的信息,请参阅 perldoc perlre

      希望有帮助

      【讨论】:

        猜你喜欢
        • 2018-10-30
        • 2012-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 2013-09-25
        • 2011-03-25
        相关资源
        最近更新 更多