0

我是 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,因为它需要添加到我们将分发此项目的环境中。

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

所以我需要另寻出路。

再次感谢。

此致。

4

3 回答 3

1

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

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

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

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

把它退回来。

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

于 2009-04-17T03:12:02.027 回答
0

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

然后在第二遍你可能想要启用/禁用命令?

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

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

第一次运行:添加

perl -0777 -pi -e 's{(. ?(?!AllowOverride\s+All). ?)}[\nAllowOverride All\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

希望有帮助

于 2009-04-17T05:40:47.163 回答
0

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

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

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

于 2009-04-17T03:11:21.763 回答