regex to add missing quotes











up vote
3
down vote

favorite












I am trying to add missing quotes at the ends of some lines in a text file.



I find that the regex [^"]$ suffices to find lines with missing terminal doublequotes and so tried the following replacement using a backreference (which tbh I've never used before). Using parens around the 'capture group' I hoped that sed would allow backreference to that group, but



sed  's|([^"]$)|1"|g' bigfile.tsv


hits



sed: -e expression #1, char 17: invalid reference 1 on `s' command's RHS


and same if I don't escape the replacement quotes



sed  's|([^"]$)|1"|g' bigfile.tsv


(tho now its char 16 that's offensive) . How does the backreference go? https://xkcd.com/1171/










share|improve this question




























    up vote
    3
    down vote

    favorite












    I am trying to add missing quotes at the ends of some lines in a text file.



    I find that the regex [^"]$ suffices to find lines with missing terminal doublequotes and so tried the following replacement using a backreference (which tbh I've never used before). Using parens around the 'capture group' I hoped that sed would allow backreference to that group, but



    sed  's|([^"]$)|1"|g' bigfile.tsv


    hits



    sed: -e expression #1, char 17: invalid reference 1 on `s' command's RHS


    and same if I don't escape the replacement quotes



    sed  's|([^"]$)|1"|g' bigfile.tsv


    (tho now its char 16 that's offensive) . How does the backreference go? https://xkcd.com/1171/










    share|improve this question


























      up vote
      3
      down vote

      favorite









      up vote
      3
      down vote

      favorite











      I am trying to add missing quotes at the ends of some lines in a text file.



      I find that the regex [^"]$ suffices to find lines with missing terminal doublequotes and so tried the following replacement using a backreference (which tbh I've never used before). Using parens around the 'capture group' I hoped that sed would allow backreference to that group, but



      sed  's|([^"]$)|1"|g' bigfile.tsv


      hits



      sed: -e expression #1, char 17: invalid reference 1 on `s' command's RHS


      and same if I don't escape the replacement quotes



      sed  's|([^"]$)|1"|g' bigfile.tsv


      (tho now its char 16 that's offensive) . How does the backreference go? https://xkcd.com/1171/










      share|improve this question















      I am trying to add missing quotes at the ends of some lines in a text file.



      I find that the regex [^"]$ suffices to find lines with missing terminal doublequotes and so tried the following replacement using a backreference (which tbh I've never used before). Using parens around the 'capture group' I hoped that sed would allow backreference to that group, but



      sed  's|([^"]$)|1"|g' bigfile.tsv


      hits



      sed: -e expression #1, char 17: invalid reference 1 on `s' command's RHS


      and same if I don't escape the replacement quotes



      sed  's|([^"]$)|1"|g' bigfile.tsv


      (tho now its char 16 that's offensive) . How does the backreference go? https://xkcd.com/1171/







      sed regular-expression






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 2 days ago

























      asked 2 days ago









      jeremy_rutman

      14711




      14711






















          2 Answers
          2






          active

          oldest

          votes

















          up vote
          6
          down vote



          accepted










          When you run sed without -E, then the expression is a basic regular expression and the capture groups must be written as (...). When you use -E to enable extended regular expressions, capture groups are written (...).



          The inside [...] is literal, so your expression would also avoid adding a double quote on lines ending with . Some of the other escaping is also unnecessary.



          Therefore, you may write your sed command as



          sed 's/([^"])$/1"/'


          or as



          sed -E 's/([^"])$/1"/'


          Or, using &:



          sed 's/[^"]$/&"/'


          The & in the replacement part of the expression will be substituted by the part of the input that matched the regular expression.



          A couple of other alternatives that does not use a capture group:



          sed '/[^"]$/ s/$/"/'


          This applies s/$/"/ to all lines that matches /[^"]$/.



          Or, alternatively,



          sed '/"$/ !s/$/"/'


          This applies s/$/"/ to all lines that don't match /"$/ (there's a slight difference from the other approaches here in that it also adds a " to empty lines).



          Note that in all cases, the g flag at the end is definitely not needed.






          share|improve this answer























          • Thanks for the detailed answer, this cleared up some mysteries for me
            – jeremy_rutman
            yesterday


















          up vote
          2
          down vote













          Try sed -e 's|([^"]$)|1"|g' bigfile.tsv.






          share|improve this answer








          New contributor




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














          • 1




            thank you sir, that did the trick.
            – jeremy_rutman
            2 days ago










          • This still does not add the missing " to lines ending with backslash and it needlessly uses g at the end (an anchored expression can only match once).
            – Kusalananda
            2 days ago












          • I just provided a hint about the error message; I did not intend to solve the whole problem for the author. Mostly because I think the author will learn more when doing it himself or herself.
            – U. Windl
            2 days ago










          • @U.Windl They may, or they may not ever notice.
            – Kusalananda
            2 days ago











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


          }
          });














           

          draft saved


          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f481273%2fregex-to-add-missing-quotes%23new-answer', 'question_page');
          }
          );

          Post as a guest
































          2 Answers
          2






          active

          oldest

          votes








          2 Answers
          2






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          6
          down vote



          accepted










          When you run sed without -E, then the expression is a basic regular expression and the capture groups must be written as (...). When you use -E to enable extended regular expressions, capture groups are written (...).



          The inside [...] is literal, so your expression would also avoid adding a double quote on lines ending with . Some of the other escaping is also unnecessary.



          Therefore, you may write your sed command as



          sed 's/([^"])$/1"/'


          or as



          sed -E 's/([^"])$/1"/'


          Or, using &:



          sed 's/[^"]$/&"/'


          The & in the replacement part of the expression will be substituted by the part of the input that matched the regular expression.



          A couple of other alternatives that does not use a capture group:



          sed '/[^"]$/ s/$/"/'


          This applies s/$/"/ to all lines that matches /[^"]$/.



          Or, alternatively,



          sed '/"$/ !s/$/"/'


          This applies s/$/"/ to all lines that don't match /"$/ (there's a slight difference from the other approaches here in that it also adds a " to empty lines).



          Note that in all cases, the g flag at the end is definitely not needed.






          share|improve this answer























          • Thanks for the detailed answer, this cleared up some mysteries for me
            – jeremy_rutman
            yesterday















          up vote
          6
          down vote



          accepted










          When you run sed without -E, then the expression is a basic regular expression and the capture groups must be written as (...). When you use -E to enable extended regular expressions, capture groups are written (...).



          The inside [...] is literal, so your expression would also avoid adding a double quote on lines ending with . Some of the other escaping is also unnecessary.



          Therefore, you may write your sed command as



          sed 's/([^"])$/1"/'


          or as



          sed -E 's/([^"])$/1"/'


          Or, using &:



          sed 's/[^"]$/&"/'


          The & in the replacement part of the expression will be substituted by the part of the input that matched the regular expression.



          A couple of other alternatives that does not use a capture group:



          sed '/[^"]$/ s/$/"/'


          This applies s/$/"/ to all lines that matches /[^"]$/.



          Or, alternatively,



          sed '/"$/ !s/$/"/'


          This applies s/$/"/ to all lines that don't match /"$/ (there's a slight difference from the other approaches here in that it also adds a " to empty lines).



          Note that in all cases, the g flag at the end is definitely not needed.






          share|improve this answer























          • Thanks for the detailed answer, this cleared up some mysteries for me
            – jeremy_rutman
            yesterday













          up vote
          6
          down vote



          accepted







          up vote
          6
          down vote



          accepted






          When you run sed without -E, then the expression is a basic regular expression and the capture groups must be written as (...). When you use -E to enable extended regular expressions, capture groups are written (...).



          The inside [...] is literal, so your expression would also avoid adding a double quote on lines ending with . Some of the other escaping is also unnecessary.



          Therefore, you may write your sed command as



          sed 's/([^"])$/1"/'


          or as



          sed -E 's/([^"])$/1"/'


          Or, using &:



          sed 's/[^"]$/&"/'


          The & in the replacement part of the expression will be substituted by the part of the input that matched the regular expression.



          A couple of other alternatives that does not use a capture group:



          sed '/[^"]$/ s/$/"/'


          This applies s/$/"/ to all lines that matches /[^"]$/.



          Or, alternatively,



          sed '/"$/ !s/$/"/'


          This applies s/$/"/ to all lines that don't match /"$/ (there's a slight difference from the other approaches here in that it also adds a " to empty lines).



          Note that in all cases, the g flag at the end is definitely not needed.






          share|improve this answer














          When you run sed without -E, then the expression is a basic regular expression and the capture groups must be written as (...). When you use -E to enable extended regular expressions, capture groups are written (...).



          The inside [...] is literal, so your expression would also avoid adding a double quote on lines ending with . Some of the other escaping is also unnecessary.



          Therefore, you may write your sed command as



          sed 's/([^"])$/1"/'


          or as



          sed -E 's/([^"])$/1"/'


          Or, using &:



          sed 's/[^"]$/&"/'


          The & in the replacement part of the expression will be substituted by the part of the input that matched the regular expression.



          A couple of other alternatives that does not use a capture group:



          sed '/[^"]$/ s/$/"/'


          This applies s/$/"/ to all lines that matches /[^"]$/.



          Or, alternatively,



          sed '/"$/ !s/$/"/'


          This applies s/$/"/ to all lines that don't match /"$/ (there's a slight difference from the other approaches here in that it also adds a " to empty lines).



          Note that in all cases, the g flag at the end is definitely not needed.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 2 days ago









          Stéphane Chazelas

          293k54547888




          293k54547888










          answered 2 days ago









          Kusalananda

          115k15218349




          115k15218349












          • Thanks for the detailed answer, this cleared up some mysteries for me
            – jeremy_rutman
            yesterday


















          • Thanks for the detailed answer, this cleared up some mysteries for me
            – jeremy_rutman
            yesterday
















          Thanks for the detailed answer, this cleared up some mysteries for me
          – jeremy_rutman
          yesterday




          Thanks for the detailed answer, this cleared up some mysteries for me
          – jeremy_rutman
          yesterday












          up vote
          2
          down vote













          Try sed -e 's|([^"]$)|1"|g' bigfile.tsv.






          share|improve this answer








          New contributor




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














          • 1




            thank you sir, that did the trick.
            – jeremy_rutman
            2 days ago










          • This still does not add the missing " to lines ending with backslash and it needlessly uses g at the end (an anchored expression can only match once).
            – Kusalananda
            2 days ago












          • I just provided a hint about the error message; I did not intend to solve the whole problem for the author. Mostly because I think the author will learn more when doing it himself or herself.
            – U. Windl
            2 days ago










          • @U.Windl They may, or they may not ever notice.
            – Kusalananda
            2 days ago















          up vote
          2
          down vote













          Try sed -e 's|([^"]$)|1"|g' bigfile.tsv.






          share|improve this answer








          New contributor




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














          • 1




            thank you sir, that did the trick.
            – jeremy_rutman
            2 days ago










          • This still does not add the missing " to lines ending with backslash and it needlessly uses g at the end (an anchored expression can only match once).
            – Kusalananda
            2 days ago












          • I just provided a hint about the error message; I did not intend to solve the whole problem for the author. Mostly because I think the author will learn more when doing it himself or herself.
            – U. Windl
            2 days ago










          • @U.Windl They may, or they may not ever notice.
            – Kusalananda
            2 days ago













          up vote
          2
          down vote










          up vote
          2
          down vote









          Try sed -e 's|([^"]$)|1"|g' bigfile.tsv.






          share|improve this answer








          New contributor




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









          Try sed -e 's|([^"]$)|1"|g' bigfile.tsv.







          share|improve this answer








          New contributor




          U. Windl 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 answer



          share|improve this answer






          New contributor




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









          answered 2 days ago









          U. Windl

          1313




          1313




          New contributor




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





          New contributor





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






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








          • 1




            thank you sir, that did the trick.
            – jeremy_rutman
            2 days ago










          • This still does not add the missing " to lines ending with backslash and it needlessly uses g at the end (an anchored expression can only match once).
            – Kusalananda
            2 days ago












          • I just provided a hint about the error message; I did not intend to solve the whole problem for the author. Mostly because I think the author will learn more when doing it himself or herself.
            – U. Windl
            2 days ago










          • @U.Windl They may, or they may not ever notice.
            – Kusalananda
            2 days ago














          • 1




            thank you sir, that did the trick.
            – jeremy_rutman
            2 days ago










          • This still does not add the missing " to lines ending with backslash and it needlessly uses g at the end (an anchored expression can only match once).
            – Kusalananda
            2 days ago












          • I just provided a hint about the error message; I did not intend to solve the whole problem for the author. Mostly because I think the author will learn more when doing it himself or herself.
            – U. Windl
            2 days ago










          • @U.Windl They may, or they may not ever notice.
            – Kusalananda
            2 days ago








          1




          1




          thank you sir, that did the trick.
          – jeremy_rutman
          2 days ago




          thank you sir, that did the trick.
          – jeremy_rutman
          2 days ago












          This still does not add the missing " to lines ending with backslash and it needlessly uses g at the end (an anchored expression can only match once).
          – Kusalananda
          2 days ago






          This still does not add the missing " to lines ending with backslash and it needlessly uses g at the end (an anchored expression can only match once).
          – Kusalananda
          2 days ago














          I just provided a hint about the error message; I did not intend to solve the whole problem for the author. Mostly because I think the author will learn more when doing it himself or herself.
          – U. Windl
          2 days ago




          I just provided a hint about the error message; I did not intend to solve the whole problem for the author. Mostly because I think the author will learn more when doing it himself or herself.
          – U. Windl
          2 days ago












          @U.Windl They may, or they may not ever notice.
          – Kusalananda
          2 days ago




          @U.Windl They may, or they may not ever notice.
          – Kusalananda
          2 days ago


















           

          draft saved


          draft discarded



















































           


          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f481273%2fregex-to-add-missing-quotes%23new-answer', 'question_page');
          }
          );

          Post as a guest




















































































          Popular posts from this blog

          Biblatex bibliography style without URLs when DOI exists (in Overleaf with Zotero bibliography)

          ComboBox Display Member on multiple fields

          Is it possible to collect Nectar points via Trainline?