Here’s a question from our regular reader Mr. Rajan. He wants to use
Sed to search and replace a line between pattern ranges. Well, here’s a question from him.
I have been writing a shell script to automate few tasks on VPS. For instance, I wanted to modify
"AllowOverride None" to "AllowOverride All"that’s located within a particular
<Directory "/var/www/html">. The idea is to replace only the line within that particular <Directory> block without affecting other <Directory> blocks (actually there are many, but I’m concerned about the block that contains
"/var/www/html"). The reason, I wanted to do this is, I had difficulty in configuring Apache to allow Overrides from
For example: In the below code from
httpd.conffile, I need to search for the pattern
<Directory "/var/www/html">and replace AllowOverride None with AllowOverride All located within this directory structure without affecting other directory structure.<Directory "/var/www/html"> AllowOverride None </Directory>
Please help me.
Using Sed to Search & replace a line between pattern ranges
This seems to be a task for
sed supports pattern ranges in this form:
sed '/startpattern/,/endpattern/ <sed-commands>' file
So as per the Rajan’s requirement, we need to search for starting pattern
<Directory "/var/www/html">, ending pattern
</Directory> and find
"AllowOverride None" and replace it with "AllowOverride all". To do that, the
sed command should be used as shown below.
#sed -i '/<Directory "\/var\/www\/html">/,/<\/Directory>/ s/AllowOverride None/AllowOverride all/' httpd.conf
-i option is to edit files in place. If you don’t use the option
-i, then the modified output will be printed on the
stdout and the file wouldn’t be changed!