Multiline string replace inside markup tag












0














I am trying to modify an httpd.conf file, allowing override in the /var/www/html directory. For simplicity's sake, let's say it looks like this:



<Directory "/var/www/html">
# Comment
AllowOverride none
# Comment
</Directory>


Trying to replace AllowOverride none with AllowOverride All.



I tried something like this:



sed -i 's/(Directory "/var/www/html">.*?)AllowOverride none(.*?</Directory>)/1AllowOverride all2/' httpd.conf


It doesn't look like it catches multiple lines, so I tried some other things, such as RegEx modifiers and this: https://www.gnu.org/software/sed/manual/html_node/Text-search-across-multiple-lines.html
but was unable to match the desired string.



How would one go about doing this? Solutions outside of sed are welcome as well.










share|improve this question



























    0














    I am trying to modify an httpd.conf file, allowing override in the /var/www/html directory. For simplicity's sake, let's say it looks like this:



    <Directory "/var/www/html">
    # Comment
    AllowOverride none
    # Comment
    </Directory>


    Trying to replace AllowOverride none with AllowOverride All.



    I tried something like this:



    sed -i 's/(Directory "/var/www/html">.*?)AllowOverride none(.*?</Directory>)/1AllowOverride all2/' httpd.conf


    It doesn't look like it catches multiple lines, so I tried some other things, such as RegEx modifiers and this: https://www.gnu.org/software/sed/manual/html_node/Text-search-across-multiple-lines.html
    but was unable to match the desired string.



    How would one go about doing this? Solutions outside of sed are welcome as well.










    share|improve this question

























      0












      0








      0







      I am trying to modify an httpd.conf file, allowing override in the /var/www/html directory. For simplicity's sake, let's say it looks like this:



      <Directory "/var/www/html">
      # Comment
      AllowOverride none
      # Comment
      </Directory>


      Trying to replace AllowOverride none with AllowOverride All.



      I tried something like this:



      sed -i 's/(Directory "/var/www/html">.*?)AllowOverride none(.*?</Directory>)/1AllowOverride all2/' httpd.conf


      It doesn't look like it catches multiple lines, so I tried some other things, such as RegEx modifiers and this: https://www.gnu.org/software/sed/manual/html_node/Text-search-across-multiple-lines.html
      but was unable to match the desired string.



      How would one go about doing this? Solutions outside of sed are welcome as well.










      share|improve this question













      I am trying to modify an httpd.conf file, allowing override in the /var/www/html directory. For simplicity's sake, let's say it looks like this:



      <Directory "/var/www/html">
      # Comment
      AllowOverride none
      # Comment
      </Directory>


      Trying to replace AllowOverride none with AllowOverride All.



      I tried something like this:



      sed -i 's/(Directory "/var/www/html">.*?)AllowOverride none(.*?</Directory>)/1AllowOverride all2/' httpd.conf


      It doesn't look like it catches multiple lines, so I tried some other things, such as RegEx modifiers and this: https://www.gnu.org/software/sed/manual/html_node/Text-search-across-multiple-lines.html
      but was unable to match the desired string.



      How would one go about doing this? Solutions outside of sed are welcome as well.







      sed apache-httpd replace






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Dec 27 '18 at 15:41









      YnhockeyYnhockey

      1033




      1033






















          2 Answers
          2






          active

          oldest

          votes


















          1














          I'm going to assume that what you want is to replace ONLY the AllowOverride none specifically in the <Directory "/var/www/html"> block and not elsewhere. We can do that.



          Short version:



          sed -i '/^<Directory "/var/www/html">/,/^</Directory>/ {
          s/AllowOverride none/AllowOverride all/;
          }' httpd.conf


          This says to only apply the substitute command between the specified lines.



          Remember to back up your file first, and diff them after to confirm you got what you wanted. :)






          share|improve this answer





























            1














            sed, being a *nix text tool, is line based. To work upon several lines, you need to take certain measures. Why doesn't



            sed 's/AllowOverride none/AllowOverride all/' file


            satisfy your needs?



            EDIT: or, if you only want to change the string in that "directory" paragraph,



            sed '/<Directory "/var/www/html">/,/</Directory>/ s/AllowOverride none/AllowOverride all/' file


            EDIT: With three small adaptions, you make your own script work correctly:



            sed    's/(Directory "/var/www/html">.*?)AllowOverride none(.*?</Directory>)/1AllowOverride all2/' file
            sed -z 's/(Directory "/var/www/html">.*)AllowOverride none(.*</Directory>)/1AllowOverride all2/' file
            ^ ^ ^


            -z (--null-data, separate lines by NUL characters; cf. man sed) makes sed ignore line feed chars, i.e. loads the entire file. The two ? indicated by the carets must go away. And, be aware that the " don't need the escape (but it doesn't hurt).






            share|improve this answer























              Your Answer








              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "106"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: false,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: null,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });














              draft saved

              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f491150%2fmultiline-string-replace-inside-markup-tag%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              2 Answers
              2






              active

              oldest

              votes








              2 Answers
              2






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              1














              I'm going to assume that what you want is to replace ONLY the AllowOverride none specifically in the <Directory "/var/www/html"> block and not elsewhere. We can do that.



              Short version:



              sed -i '/^<Directory "/var/www/html">/,/^</Directory>/ {
              s/AllowOverride none/AllowOverride all/;
              }' httpd.conf


              This says to only apply the substitute command between the specified lines.



              Remember to back up your file first, and diff them after to confirm you got what you wanted. :)






              share|improve this answer


























                1














                I'm going to assume that what you want is to replace ONLY the AllowOverride none specifically in the <Directory "/var/www/html"> block and not elsewhere. We can do that.



                Short version:



                sed -i '/^<Directory "/var/www/html">/,/^</Directory>/ {
                s/AllowOverride none/AllowOverride all/;
                }' httpd.conf


                This says to only apply the substitute command between the specified lines.



                Remember to back up your file first, and diff them after to confirm you got what you wanted. :)






                share|improve this answer
























                  1












                  1








                  1






                  I'm going to assume that what you want is to replace ONLY the AllowOverride none specifically in the <Directory "/var/www/html"> block and not elsewhere. We can do that.



                  Short version:



                  sed -i '/^<Directory "/var/www/html">/,/^</Directory>/ {
                  s/AllowOverride none/AllowOverride all/;
                  }' httpd.conf


                  This says to only apply the substitute command between the specified lines.



                  Remember to back up your file first, and diff them after to confirm you got what you wanted. :)






                  share|improve this answer












                  I'm going to assume that what you want is to replace ONLY the AllowOverride none specifically in the <Directory "/var/www/html"> block and not elsewhere. We can do that.



                  Short version:



                  sed -i '/^<Directory "/var/www/html">/,/^</Directory>/ {
                  s/AllowOverride none/AllowOverride all/;
                  }' httpd.conf


                  This says to only apply the substitute command between the specified lines.



                  Remember to back up your file first, and diff them after to confirm you got what you wanted. :)







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Dec 27 '18 at 18:32









                  Paul HodgesPaul Hodges

                  1913




                  1913

























                      1














                      sed, being a *nix text tool, is line based. To work upon several lines, you need to take certain measures. Why doesn't



                      sed 's/AllowOverride none/AllowOverride all/' file


                      satisfy your needs?



                      EDIT: or, if you only want to change the string in that "directory" paragraph,



                      sed '/<Directory "/var/www/html">/,/</Directory>/ s/AllowOverride none/AllowOverride all/' file


                      EDIT: With three small adaptions, you make your own script work correctly:



                      sed    's/(Directory "/var/www/html">.*?)AllowOverride none(.*?</Directory>)/1AllowOverride all2/' file
                      sed -z 's/(Directory "/var/www/html">.*)AllowOverride none(.*</Directory>)/1AllowOverride all2/' file
                      ^ ^ ^


                      -z (--null-data, separate lines by NUL characters; cf. man sed) makes sed ignore line feed chars, i.e. loads the entire file. The two ? indicated by the carets must go away. And, be aware that the " don't need the escape (but it doesn't hurt).






                      share|improve this answer




























                        1














                        sed, being a *nix text tool, is line based. To work upon several lines, you need to take certain measures. Why doesn't



                        sed 's/AllowOverride none/AllowOverride all/' file


                        satisfy your needs?



                        EDIT: or, if you only want to change the string in that "directory" paragraph,



                        sed '/<Directory "/var/www/html">/,/</Directory>/ s/AllowOverride none/AllowOverride all/' file


                        EDIT: With three small adaptions, you make your own script work correctly:



                        sed    's/(Directory "/var/www/html">.*?)AllowOverride none(.*?</Directory>)/1AllowOverride all2/' file
                        sed -z 's/(Directory "/var/www/html">.*)AllowOverride none(.*</Directory>)/1AllowOverride all2/' file
                        ^ ^ ^


                        -z (--null-data, separate lines by NUL characters; cf. man sed) makes sed ignore line feed chars, i.e. loads the entire file. The two ? indicated by the carets must go away. And, be aware that the " don't need the escape (but it doesn't hurt).






                        share|improve this answer


























                          1












                          1








                          1






                          sed, being a *nix text tool, is line based. To work upon several lines, you need to take certain measures. Why doesn't



                          sed 's/AllowOverride none/AllowOverride all/' file


                          satisfy your needs?



                          EDIT: or, if you only want to change the string in that "directory" paragraph,



                          sed '/<Directory "/var/www/html">/,/</Directory>/ s/AllowOverride none/AllowOverride all/' file


                          EDIT: With three small adaptions, you make your own script work correctly:



                          sed    's/(Directory "/var/www/html">.*?)AllowOverride none(.*?</Directory>)/1AllowOverride all2/' file
                          sed -z 's/(Directory "/var/www/html">.*)AllowOverride none(.*</Directory>)/1AllowOverride all2/' file
                          ^ ^ ^


                          -z (--null-data, separate lines by NUL characters; cf. man sed) makes sed ignore line feed chars, i.e. loads the entire file. The two ? indicated by the carets must go away. And, be aware that the " don't need the escape (but it doesn't hurt).






                          share|improve this answer














                          sed, being a *nix text tool, is line based. To work upon several lines, you need to take certain measures. Why doesn't



                          sed 's/AllowOverride none/AllowOverride all/' file


                          satisfy your needs?



                          EDIT: or, if you only want to change the string in that "directory" paragraph,



                          sed '/<Directory "/var/www/html">/,/</Directory>/ s/AllowOverride none/AllowOverride all/' file


                          EDIT: With three small adaptions, you make your own script work correctly:



                          sed    's/(Directory "/var/www/html">.*?)AllowOverride none(.*?</Directory>)/1AllowOverride all2/' file
                          sed -z 's/(Directory "/var/www/html">.*)AllowOverride none(.*</Directory>)/1AllowOverride all2/' file
                          ^ ^ ^


                          -z (--null-data, separate lines by NUL characters; cf. man sed) makes sed ignore line feed chars, i.e. loads the entire file. The two ? indicated by the carets must go away. And, be aware that the " don't need the escape (but it doesn't hurt).







                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited Dec 27 '18 at 22:07

























                          answered Dec 27 '18 at 17:26









                          RudiCRudiC

                          4,2041312




                          4,2041312






























                              draft saved

                              draft discarded




















































                              Thanks for contributing an answer to Unix & Linux Stack Exchange!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.





                              Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                              Please pay close attention to the following guidance:


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f491150%2fmultiline-string-replace-inside-markup-tag%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Morgemoulin

                              Scott Moir

                              Souastre