How to copy the rest of lines of a file to another file












2















I have the string xyz which is a line in file1.txt, I want to copy all the lines after xyz in file1.txt to a new file file2.txt. How can I achieve this?



I know about cat command. But how to specify the starting line?










share|improve this question


















  • 2





    Do you want to include that xyz line or exclude it from being copied ? Also, what happens if you have multiple lines matching xyz ?

    – don_crissti
    1 hour ago






  • 2





    Possible duplicate of How to print all lines after a match up to the end of the file?

    – Kusalananda
    1 hour ago
















2















I have the string xyz which is a line in file1.txt, I want to copy all the lines after xyz in file1.txt to a new file file2.txt. How can I achieve this?



I know about cat command. But how to specify the starting line?










share|improve this question


















  • 2





    Do you want to include that xyz line or exclude it from being copied ? Also, what happens if you have multiple lines matching xyz ?

    – don_crissti
    1 hour ago






  • 2





    Possible duplicate of How to print all lines after a match up to the end of the file?

    – Kusalananda
    1 hour ago














2












2








2


0






I have the string xyz which is a line in file1.txt, I want to copy all the lines after xyz in file1.txt to a new file file2.txt. How can I achieve this?



I know about cat command. But how to specify the starting line?










share|improve this question














I have the string xyz which is a line in file1.txt, I want to copy all the lines after xyz in file1.txt to a new file file2.txt. How can I achieve this?



I know about cat command. But how to specify the starting line?







files grep cat file-copy file-transfer






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked 2 hours ago









user9371654user9371654

30617




30617








  • 2





    Do you want to include that xyz line or exclude it from being copied ? Also, what happens if you have multiple lines matching xyz ?

    – don_crissti
    1 hour ago






  • 2





    Possible duplicate of How to print all lines after a match up to the end of the file?

    – Kusalananda
    1 hour ago














  • 2





    Do you want to include that xyz line or exclude it from being copied ? Also, what happens if you have multiple lines matching xyz ?

    – don_crissti
    1 hour ago






  • 2





    Possible duplicate of How to print all lines after a match up to the end of the file?

    – Kusalananda
    1 hour ago








2




2





Do you want to include that xyz line or exclude it from being copied ? Also, what happens if you have multiple lines matching xyz ?

– don_crissti
1 hour ago





Do you want to include that xyz line or exclude it from being copied ? Also, what happens if you have multiple lines matching xyz ?

– don_crissti
1 hour ago




2




2





Possible duplicate of How to print all lines after a match up to the end of the file?

– Kusalananda
1 hour ago





Possible duplicate of How to print all lines after a match up to the end of the file?

– Kusalananda
1 hour ago










4 Answers
4






active

oldest

votes


















3














Using GNU sed



To copy all lines after xyz, try:



sed '0,/xyz/d' file1.txt >file2.txt


1,/xyz/ specifies a range of lines starting with the first and ending with the first occurrence of a line matching xyz. d tells sed to delete those lines.



Note: For BSD/MacOS sed, one can use sed '1,/xyz/d' file1.txt >file2.txt but this only works if the first appearance of xyz is in the second line or later. (Hat tip: kusalananda.)



Another approach, as suggested by don_crissti, should work for all sed:



{ printf %s\n; cat file1.txt; } | sed '1,/xyz/d' >file2.txt


Example



Consider this test file:



$ cat file1.txt
a
b
xyz
c
d


Run our command:



$ sed '1,/xyz/d' file1.txt >file2.txt
$ cat file2.txt
c
d


Using awk



The same logic can used with awk:



awk 'NR==1,/xyz/{next} 1' file1.txt >file2.txt


NR==1,/xyz/{next} tells awk to skip over all lines from the first (NR==1) to the first line matching the regex xyz. 1 tells awk to print any remaining lines.






share|improve this answer


























  • @don_crissti Are you referring to this answer? If so, it does not work for me. This is because sed, as currently written, like many other utilities, does not read in a line at a time; it reads in a buffer-full at a time.

    – John1024
    1 hour ago













  • @John1024 What sed are you using there?

    – Kusalananda
    32 mins ago











  • @Kusalananda sed --version returns (GNU sed) 4.4.

    – John1024
    30 mins ago











  • @don_crissti Very good. Thanks! I added the printf solution to the answer.

    – John1024
    17 mins ago



















2














With ed:



ed -s file.txt <<< $'/xyz/+1,$w file2.txt'


This sends one (ranged) command to ed: from the line after (+1) the one containing xyz until the end of the file ($), write those lines to file2.txt.






share|improve this answer































    0














    $ sed -n '/xyz/,$p' file.txt > file2.txt


    With -n we prevent sed to print every line. With $ means end of file end p stands for print line. So /xyz/$p means: If a line matches xyz print it until the end of the file.






    share|improve this answer
























    • This would also print the line matching xyz, not from the line after.

      – Kusalananda
      1 hour ago



















    0














    There is also csplit :



    csplit -s file1.txt %xyz%1





    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%2f505388%2fhow-to-copy-the-rest-of-lines-of-a-file-to-another-file%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      4 Answers
      4






      active

      oldest

      votes








      4 Answers
      4






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      3














      Using GNU sed



      To copy all lines after xyz, try:



      sed '0,/xyz/d' file1.txt >file2.txt


      1,/xyz/ specifies a range of lines starting with the first and ending with the first occurrence of a line matching xyz. d tells sed to delete those lines.



      Note: For BSD/MacOS sed, one can use sed '1,/xyz/d' file1.txt >file2.txt but this only works if the first appearance of xyz is in the second line or later. (Hat tip: kusalananda.)



      Another approach, as suggested by don_crissti, should work for all sed:



      { printf %s\n; cat file1.txt; } | sed '1,/xyz/d' >file2.txt


      Example



      Consider this test file:



      $ cat file1.txt
      a
      b
      xyz
      c
      d


      Run our command:



      $ sed '1,/xyz/d' file1.txt >file2.txt
      $ cat file2.txt
      c
      d


      Using awk



      The same logic can used with awk:



      awk 'NR==1,/xyz/{next} 1' file1.txt >file2.txt


      NR==1,/xyz/{next} tells awk to skip over all lines from the first (NR==1) to the first line matching the regex xyz. 1 tells awk to print any remaining lines.






      share|improve this answer


























      • @don_crissti Are you referring to this answer? If so, it does not work for me. This is because sed, as currently written, like many other utilities, does not read in a line at a time; it reads in a buffer-full at a time.

        – John1024
        1 hour ago













      • @John1024 What sed are you using there?

        – Kusalananda
        32 mins ago











      • @Kusalananda sed --version returns (GNU sed) 4.4.

        – John1024
        30 mins ago











      • @don_crissti Very good. Thanks! I added the printf solution to the answer.

        – John1024
        17 mins ago
















      3














      Using GNU sed



      To copy all lines after xyz, try:



      sed '0,/xyz/d' file1.txt >file2.txt


      1,/xyz/ specifies a range of lines starting with the first and ending with the first occurrence of a line matching xyz. d tells sed to delete those lines.



      Note: For BSD/MacOS sed, one can use sed '1,/xyz/d' file1.txt >file2.txt but this only works if the first appearance of xyz is in the second line or later. (Hat tip: kusalananda.)



      Another approach, as suggested by don_crissti, should work for all sed:



      { printf %s\n; cat file1.txt; } | sed '1,/xyz/d' >file2.txt


      Example



      Consider this test file:



      $ cat file1.txt
      a
      b
      xyz
      c
      d


      Run our command:



      $ sed '1,/xyz/d' file1.txt >file2.txt
      $ cat file2.txt
      c
      d


      Using awk



      The same logic can used with awk:



      awk 'NR==1,/xyz/{next} 1' file1.txt >file2.txt


      NR==1,/xyz/{next} tells awk to skip over all lines from the first (NR==1) to the first line matching the regex xyz. 1 tells awk to print any remaining lines.






      share|improve this answer


























      • @don_crissti Are you referring to this answer? If so, it does not work for me. This is because sed, as currently written, like many other utilities, does not read in a line at a time; it reads in a buffer-full at a time.

        – John1024
        1 hour ago













      • @John1024 What sed are you using there?

        – Kusalananda
        32 mins ago











      • @Kusalananda sed --version returns (GNU sed) 4.4.

        – John1024
        30 mins ago











      • @don_crissti Very good. Thanks! I added the printf solution to the answer.

        – John1024
        17 mins ago














      3












      3








      3







      Using GNU sed



      To copy all lines after xyz, try:



      sed '0,/xyz/d' file1.txt >file2.txt


      1,/xyz/ specifies a range of lines starting with the first and ending with the first occurrence of a line matching xyz. d tells sed to delete those lines.



      Note: For BSD/MacOS sed, one can use sed '1,/xyz/d' file1.txt >file2.txt but this only works if the first appearance of xyz is in the second line or later. (Hat tip: kusalananda.)



      Another approach, as suggested by don_crissti, should work for all sed:



      { printf %s\n; cat file1.txt; } | sed '1,/xyz/d' >file2.txt


      Example



      Consider this test file:



      $ cat file1.txt
      a
      b
      xyz
      c
      d


      Run our command:



      $ sed '1,/xyz/d' file1.txt >file2.txt
      $ cat file2.txt
      c
      d


      Using awk



      The same logic can used with awk:



      awk 'NR==1,/xyz/{next} 1' file1.txt >file2.txt


      NR==1,/xyz/{next} tells awk to skip over all lines from the first (NR==1) to the first line matching the regex xyz. 1 tells awk to print any remaining lines.






      share|improve this answer















      Using GNU sed



      To copy all lines after xyz, try:



      sed '0,/xyz/d' file1.txt >file2.txt


      1,/xyz/ specifies a range of lines starting with the first and ending with the first occurrence of a line matching xyz. d tells sed to delete those lines.



      Note: For BSD/MacOS sed, one can use sed '1,/xyz/d' file1.txt >file2.txt but this only works if the first appearance of xyz is in the second line or later. (Hat tip: kusalananda.)



      Another approach, as suggested by don_crissti, should work for all sed:



      { printf %s\n; cat file1.txt; } | sed '1,/xyz/d' >file2.txt


      Example



      Consider this test file:



      $ cat file1.txt
      a
      b
      xyz
      c
      d


      Run our command:



      $ sed '1,/xyz/d' file1.txt >file2.txt
      $ cat file2.txt
      c
      d


      Using awk



      The same logic can used with awk:



      awk 'NR==1,/xyz/{next} 1' file1.txt >file2.txt


      NR==1,/xyz/{next} tells awk to skip over all lines from the first (NR==1) to the first line matching the regex xyz. 1 tells awk to print any remaining lines.







      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited 17 mins ago

























      answered 1 hour ago









      John1024John1024

      47.5k5110125




      47.5k5110125













      • @don_crissti Are you referring to this answer? If so, it does not work for me. This is because sed, as currently written, like many other utilities, does not read in a line at a time; it reads in a buffer-full at a time.

        – John1024
        1 hour ago













      • @John1024 What sed are you using there?

        – Kusalananda
        32 mins ago











      • @Kusalananda sed --version returns (GNU sed) 4.4.

        – John1024
        30 mins ago











      • @don_crissti Very good. Thanks! I added the printf solution to the answer.

        – John1024
        17 mins ago



















      • @don_crissti Are you referring to this answer? If so, it does not work for me. This is because sed, as currently written, like many other utilities, does not read in a line at a time; it reads in a buffer-full at a time.

        – John1024
        1 hour ago













      • @John1024 What sed are you using there?

        – Kusalananda
        32 mins ago











      • @Kusalananda sed --version returns (GNU sed) 4.4.

        – John1024
        30 mins ago











      • @don_crissti Very good. Thanks! I added the printf solution to the answer.

        – John1024
        17 mins ago

















      @don_crissti Are you referring to this answer? If so, it does not work for me. This is because sed, as currently written, like many other utilities, does not read in a line at a time; it reads in a buffer-full at a time.

      – John1024
      1 hour ago







      @don_crissti Are you referring to this answer? If so, it does not work for me. This is because sed, as currently written, like many other utilities, does not read in a line at a time; it reads in a buffer-full at a time.

      – John1024
      1 hour ago















      @John1024 What sed are you using there?

      – Kusalananda
      32 mins ago





      @John1024 What sed are you using there?

      – Kusalananda
      32 mins ago













      @Kusalananda sed --version returns (GNU sed) 4.4.

      – John1024
      30 mins ago





      @Kusalananda sed --version returns (GNU sed) 4.4.

      – John1024
      30 mins ago













      @don_crissti Very good. Thanks! I added the printf solution to the answer.

      – John1024
      17 mins ago





      @don_crissti Very good. Thanks! I added the printf solution to the answer.

      – John1024
      17 mins ago













      2














      With ed:



      ed -s file.txt <<< $'/xyz/+1,$w file2.txt'


      This sends one (ranged) command to ed: from the line after (+1) the one containing xyz until the end of the file ($), write those lines to file2.txt.






      share|improve this answer




























        2














        With ed:



        ed -s file.txt <<< $'/xyz/+1,$w file2.txt'


        This sends one (ranged) command to ed: from the line after (+1) the one containing xyz until the end of the file ($), write those lines to file2.txt.






        share|improve this answer


























          2












          2








          2







          With ed:



          ed -s file.txt <<< $'/xyz/+1,$w file2.txt'


          This sends one (ranged) command to ed: from the line after (+1) the one containing xyz until the end of the file ($), write those lines to file2.txt.






          share|improve this answer













          With ed:



          ed -s file.txt <<< $'/xyz/+1,$w file2.txt'


          This sends one (ranged) command to ed: from the line after (+1) the one containing xyz until the end of the file ($), write those lines to file2.txt.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered 57 mins ago









          Jeff SchallerJeff Schaller

          43.2k1159138




          43.2k1159138























              0














              $ sed -n '/xyz/,$p' file.txt > file2.txt


              With -n we prevent sed to print every line. With $ means end of file end p stands for print line. So /xyz/$p means: If a line matches xyz print it until the end of the file.






              share|improve this answer
























              • This would also print the line matching xyz, not from the line after.

                – Kusalananda
                1 hour ago
















              0














              $ sed -n '/xyz/,$p' file.txt > file2.txt


              With -n we prevent sed to print every line. With $ means end of file end p stands for print line. So /xyz/$p means: If a line matches xyz print it until the end of the file.






              share|improve this answer
























              • This would also print the line matching xyz, not from the line after.

                – Kusalananda
                1 hour ago














              0












              0








              0







              $ sed -n '/xyz/,$p' file.txt > file2.txt


              With -n we prevent sed to print every line. With $ means end of file end p stands for print line. So /xyz/$p means: If a line matches xyz print it until the end of the file.






              share|improve this answer













              $ sed -n '/xyz/,$p' file.txt > file2.txt


              With -n we prevent sed to print every line. With $ means end of file end p stands for print line. So /xyz/$p means: If a line matches xyz print it until the end of the file.







              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered 1 hour ago









              finswimmerfinswimmer

              72917




              72917













              • This would also print the line matching xyz, not from the line after.

                – Kusalananda
                1 hour ago



















              • This would also print the line matching xyz, not from the line after.

                – Kusalananda
                1 hour ago

















              This would also print the line matching xyz, not from the line after.

              – Kusalananda
              1 hour ago





              This would also print the line matching xyz, not from the line after.

              – Kusalananda
              1 hour ago











              0














              There is also csplit :



              csplit -s file1.txt %xyz%1





              share|improve this answer




























                0














                There is also csplit :



                csplit -s file1.txt %xyz%1





                share|improve this answer


























                  0












                  0








                  0







                  There is also csplit :



                  csplit -s file1.txt %xyz%1





                  share|improve this answer













                  There is also csplit :



                  csplit -s file1.txt %xyz%1






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered 1 hour ago









                  ctac_ctac_

                  1,4221210




                  1,4221210






























                      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.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f505388%2fhow-to-copy-the-rest-of-lines-of-a-file-to-another-file%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

                      香粉寮

                      GameSpot