grep命令替换Fedora上httpd.conf文件中的多行文本

grep命令替换Fedora上httpd.conf文件中的多行文本,grep,fedora,multiline,httpd.conf,Grep,Fedora,Multiline,Httpd.conf,我是shell脚本和Linux环境的新手 在我的项目中,我试图从httpd.conf文件中搜索以下文本 <Directory '/somedir/someinnerdir'> AllowOverride All </Directory> 允许超越所有 然后删除此文本并再次重写相同的文本。 进行此重写的原因是,该脚本将在首次安装web应用程序时运行,但它可能会在一段时间后再次运行,因为此shell脚本的其他部分也在执行其他任务。因此,这段文字第一次不会被发现,只会被写

我是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-ve“\\nAllowOverride All\\n”/etc/httpd/conf/httpd.conf>tmp\u direct
echo-e“\\n所有远程覆盖\\n”>>tmp\U直接
mv tmp_direct/etc/httpd/conf/httpd.conf
我目前没有代码,因此上面可能有一些语法错误,但逻辑/编码是相同的

由于grep命令不支持多行搜索,上面的代码片段无法实现我想要实现的功能

我的操作系统是Fedora8

你能不能在这段代码中提出一些建议,以达到所需的目的,或者可能是其他的选择

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

提前谢谢


谢谢你的回复

对不起,前面的错误代码。现在更正了

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

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

所以我需要找到其他的出路

再次感谢


致以最诚挚的问候。

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

^匹配行首,$匹配行尾


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

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

sed -i.bak -e '/AllowOverride All/i# '  file
注释掉该行(记住httpd.conf有注释),后跟

sed -i.bak -e 's/# AllowOverride All/AllowOverride All '  file
把它推回


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

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

然后在第二遍时,您可能希望启用/禁用该命令

如果我没记错的话,“AllowOverride”只允许在部分中使用,因此只有在定义中添加/启用才有意义:

如果上面是真的,您可以在perl中执行此操作

第一次运行:添加

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

仅当目录节中尚未包含“AllowOverride All”时,才会将其添加到目录节中

第二次运行:更改

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

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

并在

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

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

perl命令选项的解释

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

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

-i允许您就地编辑文件(因此您在“-e”中的命令可以更改文件)

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

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


希望这对我有帮助。抱歉,提交了上一篇没有代码块的文章。所以它删除了目录标签。请找到正确的邮政编码。