With sed
you can select all lines in a file between two patterns(including the two lines containing PAT1
and PAT2
) and replace them like so:
sed '/PAT1/,/PAT2/c \REPLACEMENT' file
REPLACEMENT
is text, which has each embedded newline preceded by a backslash.
Notice that if PAT1
or PAT2
contain foreword slashes /
then either each one of them must be escaped with a backslash \/
or the delimiter must be changed to something other than /
and in which case you need to escape the first of each delimiter sequence when the c \
command or any other sed
command is used e.g. you can change the delimiter to _
like so:
sed '\_PAT1_,\_PAT2_c \REPLACEMENT' file
So you can do:
sed '/<validation>/,/<\/validation>/c \<other-tag>\n<hello/>\n<more>false</more>\n</other-tag>' file
to edit this:
<xml-content>
<validation>
<timeout>2880</timeout>
<subject>example</subject>
<required>true</required>
</validation>
</xml-content>
to this:
<xml-content>
<other-tag>
<hello/>
<more>false</more>
</other-tag>
</xml-content>
Notice that the sed
s option -i
is needed if you want to edit the original file in place ... Test without it first then use it with a backup suffix e.g. -i.back
to save a backup copy of the original file with .back
extension i.e. file.back
like so:
sed -i.back '/PAT1/,/PAT2/c \REPLACEMENT' file
Notice as well that there are tools made especially to edit XML files that you can use to update,delete or insert XML elements ... See How do I replace multiple fields in multiple XML files? as an example ... Those tools however might require a rather more complex command script than what is required forsed
in some use cases like yours ... I understand why you asked for a sed
solution and would myself prefer sed
as well over specialized XML tools for such task ... Plus sed
would be more portable of course.