我是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,因为它需要添加到我们将分发此项目的环境中。
史蒂夫,我想检查多行。我没有把它放在代码块中,所以它删除了目录标签。 :(所以我需要找到其他方法。
再次感谢。
最好的问候。
答案 0 :(得分:1)
这听起来像是sed(1)
的工作。你想要的将是非常接近
sed -i.bak -e '/AllowOverride All/i# ' file
注释掉该行(请记住httpd.conf有注释),然后是
sed -i.bak -e 's/# AllowOverride All/AllowOverride All ' file
把它收回来。
警告 我还没有尝试过,您想阅读手册页并自行测试。
答案 1 :(得分:0)
如果你想确保你匹配整行,你可以这样做: grep -v“^ AllowOverride All $”
^匹配行的开头,$匹配行尾。
这有帮助吗?我不清楚你要用grep做什么。
答案 2 :(得分:0)
我不确定我理解这个问题。 如果我错了,请纠正我,但是你试图在第一次运行脚本时将'AllowOverride All'添加到httpd.conf中。如果是这样,你想要它启用吗?
然后在第二遍你可能想要启用/禁用命令?
如果我没记错,'AllowOverride'只允许在&lt;目录&gt; 部分因此只在&lt;中添加/启用才有意义目录&gt;&lt; /目录&gt; 定义:
如果真的如此,你可以在perl中做到这一点。
第一次运行:添加
perl -0777 -pi -e的{(。?(?!AllowOverride \ s + All)。?)} [\ nAllowOverride 所有\ n $ 1] ixgs的httpd.conf
只有当“目录”部分中的“AllowOverride All”尚未包含时,才会将“AllowOverride All”添加到目录部分。
第二轮:改变
在第二轮比赛中你可以评论作为查理的建议..或者如果你喜欢perl
perl -0777 -pi -e的{(。?)(AllowOverride \ s + All)(。?)} [$ 1#$ 2 $ 3] ixgs'httpd.conf
和评论
perl -0777 -pi -e的{(?)(#的AllowOverride \ S +所有)(。?)} [$ 1AllowOverride \ S +所有$ 3] ixgs' 的httpd.conf
正则表达式 s {} [] 非常冗长,并且有更好的正则表达式可以做同样的事情但是这对初学者来说更容易(希望如此):)。
perl命令选项的说明
-0777 强制Perl一次性读取整个文件,因为0777不是合法字符值
-p 在您的脚本周围放置一个循环
-i 可让您就地编辑文件(因此'-e'中的命令会更改文件)
-e 允许您在命令行上指定一行代码
在这一行中我们有一个正则表达式。有关该信息,请参阅perldoc perlre。
希望有所帮助