sed/awk string replacement with newline and tabs











up vote
-2
down vote

favorite












I have an XML file that contains the following:



<ipaddr>192.168.1.1</ipaddr>
<subnet>24</subnet>


The goal is to modify <ipaddr>192.168.1.1</ipaddr> to <ipaddr>192.168.1.125</ipaddr> and <subnet>24</subnet> to <subnet>25</subnet> in one command. I do not want to change any other subnet tags inside the file.



The problem I have encountered is that there is a newline after </ipaddr> and there are two tabs before <subnet>.



I have tried this: awk '{gsub (/<ipaddr>192.168.1.1</ipaddr>n<subnet>24</subnet>/, "<ipaddr>192.168.1.125</ipaddr>ntt<subnet>25</subnet>")}' config.xml
but it does not work.



Could someone guide me in the right direction for this?










share|improve this question









New contributor




Jay is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
























    up vote
    -2
    down vote

    favorite












    I have an XML file that contains the following:



    <ipaddr>192.168.1.1</ipaddr>
    <subnet>24</subnet>


    The goal is to modify <ipaddr>192.168.1.1</ipaddr> to <ipaddr>192.168.1.125</ipaddr> and <subnet>24</subnet> to <subnet>25</subnet> in one command. I do not want to change any other subnet tags inside the file.



    The problem I have encountered is that there is a newline after </ipaddr> and there are two tabs before <subnet>.



    I have tried this: awk '{gsub (/<ipaddr>192.168.1.1</ipaddr>n<subnet>24</subnet>/, "<ipaddr>192.168.1.125</ipaddr>ntt<subnet>25</subnet>")}' config.xml
    but it does not work.



    Could someone guide me in the right direction for this?










    share|improve this question









    New contributor




    Jay is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.






















      up vote
      -2
      down vote

      favorite









      up vote
      -2
      down vote

      favorite











      I have an XML file that contains the following:



      <ipaddr>192.168.1.1</ipaddr>
      <subnet>24</subnet>


      The goal is to modify <ipaddr>192.168.1.1</ipaddr> to <ipaddr>192.168.1.125</ipaddr> and <subnet>24</subnet> to <subnet>25</subnet> in one command. I do not want to change any other subnet tags inside the file.



      The problem I have encountered is that there is a newline after </ipaddr> and there are two tabs before <subnet>.



      I have tried this: awk '{gsub (/<ipaddr>192.168.1.1</ipaddr>n<subnet>24</subnet>/, "<ipaddr>192.168.1.125</ipaddr>ntt<subnet>25</subnet>")}' config.xml
      but it does not work.



      Could someone guide me in the right direction for this?










      share|improve this question









      New contributor




      Jay is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      I have an XML file that contains the following:



      <ipaddr>192.168.1.1</ipaddr>
      <subnet>24</subnet>


      The goal is to modify <ipaddr>192.168.1.1</ipaddr> to <ipaddr>192.168.1.125</ipaddr> and <subnet>24</subnet> to <subnet>25</subnet> in one command. I do not want to change any other subnet tags inside the file.



      The problem I have encountered is that there is a newline after </ipaddr> and there are two tabs before <subnet>.



      I have tried this: awk '{gsub (/<ipaddr>192.168.1.1</ipaddr>n<subnet>24</subnet>/, "<ipaddr>192.168.1.125</ipaddr>ntt<subnet>25</subnet>")}' config.xml
      but it does not work.



      Could someone guide me in the right direction for this?







      text-processing awk sed xml






      share|improve this question









      New contributor




      Jay is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question









      New contributor




      Jay is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question








      edited 2 days ago





















      New contributor




      Jay is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked Dec 5 at 19:44









      Jay

      12




      12




      New contributor




      Jay is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      Jay is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      Jay is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






















          2 Answers
          2






          active

          oldest

          votes

















          up vote
          0
          down vote













          This is quite incomplete a specification. What are we going to search for? Some generic pattern? The exact IP address, and exact subnet? If yes, try



          $ sed -r '/(192.168.1.)1/{s//1125/; N; s/24/25/}' file
          <ipaddr>192.168.1.125</ipaddr>
          <subnet>25</subnet>





          share|improve this answer





















          • If the IP is changed to 124 it will be again changed to 125 by the next substitution. Also, better use a limited subnet to be precise. Think what will hapen if the original subnet is 24 and the subnet change is 4 to 8 (for example). Finally, using -E is POSIX compliant (and portable).
            – Isaac
            2 days ago


















          up vote
          0
          down vote













          Assuming that you want to change the IP on one line and the sub-net on the next line:



           sed -E '/(192.168.1.)1/{s//1125/; n; s/>24</>25</}' infile


          That is not reporting any error if the IP is changed but the sub-net is not. Which seems to be what you want from your description.






          share|improve this answer





















          • This is exactly what I was looking for. Is n; the match for newline in this command?
            – Jay
            yesterday










          • Not exactly, n tells sed to read the next line from the file, then this line is matched. The end effect is that a newline must exist for this to match.
            – Isaac
            yesterday











          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',
          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
          });


          }
          });






          Jay is a new contributor. Be nice, and check out our Code of Conduct.










          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f486225%2fsed-awk-string-replacement-with-newline-and-tabs%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








          up vote
          0
          down vote













          This is quite incomplete a specification. What are we going to search for? Some generic pattern? The exact IP address, and exact subnet? If yes, try



          $ sed -r '/(192.168.1.)1/{s//1125/; N; s/24/25/}' file
          <ipaddr>192.168.1.125</ipaddr>
          <subnet>25</subnet>





          share|improve this answer





















          • If the IP is changed to 124 it will be again changed to 125 by the next substitution. Also, better use a limited subnet to be precise. Think what will hapen if the original subnet is 24 and the subnet change is 4 to 8 (for example). Finally, using -E is POSIX compliant (and portable).
            – Isaac
            2 days ago















          up vote
          0
          down vote













          This is quite incomplete a specification. What are we going to search for? Some generic pattern? The exact IP address, and exact subnet? If yes, try



          $ sed -r '/(192.168.1.)1/{s//1125/; N; s/24/25/}' file
          <ipaddr>192.168.1.125</ipaddr>
          <subnet>25</subnet>





          share|improve this answer





















          • If the IP is changed to 124 it will be again changed to 125 by the next substitution. Also, better use a limited subnet to be precise. Think what will hapen if the original subnet is 24 and the subnet change is 4 to 8 (for example). Finally, using -E is POSIX compliant (and portable).
            – Isaac
            2 days ago













          up vote
          0
          down vote










          up vote
          0
          down vote









          This is quite incomplete a specification. What are we going to search for? Some generic pattern? The exact IP address, and exact subnet? If yes, try



          $ sed -r '/(192.168.1.)1/{s//1125/; N; s/24/25/}' file
          <ipaddr>192.168.1.125</ipaddr>
          <subnet>25</subnet>





          share|improve this answer












          This is quite incomplete a specification. What are we going to search for? Some generic pattern? The exact IP address, and exact subnet? If yes, try



          $ sed -r '/(192.168.1.)1/{s//1125/; N; s/24/25/}' file
          <ipaddr>192.168.1.125</ipaddr>
          <subnet>25</subnet>






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Dec 5 at 22:15









          RudiC

          3,7171312




          3,7171312












          • If the IP is changed to 124 it will be again changed to 125 by the next substitution. Also, better use a limited subnet to be precise. Think what will hapen if the original subnet is 24 and the subnet change is 4 to 8 (for example). Finally, using -E is POSIX compliant (and portable).
            – Isaac
            2 days ago


















          • If the IP is changed to 124 it will be again changed to 125 by the next substitution. Also, better use a limited subnet to be precise. Think what will hapen if the original subnet is 24 and the subnet change is 4 to 8 (for example). Finally, using -E is POSIX compliant (and portable).
            – Isaac
            2 days ago
















          If the IP is changed to 124 it will be again changed to 125 by the next substitution. Also, better use a limited subnet to be precise. Think what will hapen if the original subnet is 24 and the subnet change is 4 to 8 (for example). Finally, using -E is POSIX compliant (and portable).
          – Isaac
          2 days ago




          If the IP is changed to 124 it will be again changed to 125 by the next substitution. Also, better use a limited subnet to be precise. Think what will hapen if the original subnet is 24 and the subnet change is 4 to 8 (for example). Finally, using -E is POSIX compliant (and portable).
          – Isaac
          2 days ago












          up vote
          0
          down vote













          Assuming that you want to change the IP on one line and the sub-net on the next line:



           sed -E '/(192.168.1.)1/{s//1125/; n; s/>24</>25</}' infile


          That is not reporting any error if the IP is changed but the sub-net is not. Which seems to be what you want from your description.






          share|improve this answer





















          • This is exactly what I was looking for. Is n; the match for newline in this command?
            – Jay
            yesterday










          • Not exactly, n tells sed to read the next line from the file, then this line is matched. The end effect is that a newline must exist for this to match.
            – Isaac
            yesterday















          up vote
          0
          down vote













          Assuming that you want to change the IP on one line and the sub-net on the next line:



           sed -E '/(192.168.1.)1/{s//1125/; n; s/>24</>25</}' infile


          That is not reporting any error if the IP is changed but the sub-net is not. Which seems to be what you want from your description.






          share|improve this answer





















          • This is exactly what I was looking for. Is n; the match for newline in this command?
            – Jay
            yesterday










          • Not exactly, n tells sed to read the next line from the file, then this line is matched. The end effect is that a newline must exist for this to match.
            – Isaac
            yesterday













          up vote
          0
          down vote










          up vote
          0
          down vote









          Assuming that you want to change the IP on one line and the sub-net on the next line:



           sed -E '/(192.168.1.)1/{s//1125/; n; s/>24</>25</}' infile


          That is not reporting any error if the IP is changed but the sub-net is not. Which seems to be what you want from your description.






          share|improve this answer












          Assuming that you want to change the IP on one line and the sub-net on the next line:



           sed -E '/(192.168.1.)1/{s//1125/; n; s/>24</>25</}' infile


          That is not reporting any error if the IP is changed but the sub-net is not. Which seems to be what you want from your description.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered 2 days ago









          Isaac

          10.7k11447




          10.7k11447












          • This is exactly what I was looking for. Is n; the match for newline in this command?
            – Jay
            yesterday










          • Not exactly, n tells sed to read the next line from the file, then this line is matched. The end effect is that a newline must exist for this to match.
            – Isaac
            yesterday


















          • This is exactly what I was looking for. Is n; the match for newline in this command?
            – Jay
            yesterday










          • Not exactly, n tells sed to read the next line from the file, then this line is matched. The end effect is that a newline must exist for this to match.
            – Isaac
            yesterday
















          This is exactly what I was looking for. Is n; the match for newline in this command?
          – Jay
          yesterday




          This is exactly what I was looking for. Is n; the match for newline in this command?
          – Jay
          yesterday












          Not exactly, n tells sed to read the next line from the file, then this line is matched. The end effect is that a newline must exist for this to match.
          – Isaac
          yesterday




          Not exactly, n tells sed to read the next line from the file, then this line is matched. The end effect is that a newline must exist for this to match.
          – Isaac
          yesterday










          Jay is a new contributor. Be nice, and check out our Code of Conduct.










          draft saved

          draft discarded


















          Jay is a new contributor. Be nice, and check out our Code of Conduct.













          Jay is a new contributor. Be nice, and check out our Code of Conduct.












          Jay is a new contributor. Be nice, and check out our Code of Conduct.
















          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%2f486225%2fsed-awk-string-replacement-with-newline-and-tabs%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

          Accessing regular linux commands in Huawei's Dopra Linux

          Can't connect RFCOMM socket: Host is down

          Kernel panic - not syncing: Fatal Exception in Interrupt