Create files from templates, substitutions in middle of other words

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP











up vote
1
down vote

favorite












Is there a way to convince m4 to replace a macro in the middle of a word?



I would like this file, day.m4:



define(Sat,Cat)dnl
Saturday


and this command:



m4 day.m4


to produce this output:



Caturday


As shown, m4 will not do this.



Alternatively, is there a way to get sed to perform multiple substitutions simultaneously? That is, without passing over the file for each substitution.



I can pipe a bunch of sed commands together or use a combination of sed and m4 and that's not so bad but if there's a convenient way to do this with one input file and one command that'd be preferable.



Any other commonly available tool would be fine too.



My goal is to use this for creating files from templates. Most of the tokens that are to be replaced are space separated.










share|improve this question



























    up vote
    1
    down vote

    favorite












    Is there a way to convince m4 to replace a macro in the middle of a word?



    I would like this file, day.m4:



    define(Sat,Cat)dnl
    Saturday


    and this command:



    m4 day.m4


    to produce this output:



    Caturday


    As shown, m4 will not do this.



    Alternatively, is there a way to get sed to perform multiple substitutions simultaneously? That is, without passing over the file for each substitution.



    I can pipe a bunch of sed commands together or use a combination of sed and m4 and that's not so bad but if there's a convenient way to do this with one input file and one command that'd be preferable.



    Any other commonly available tool would be fine too.



    My goal is to use this for creating files from templates. Most of the tokens that are to be replaced are space separated.










    share|improve this question

























      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      Is there a way to convince m4 to replace a macro in the middle of a word?



      I would like this file, day.m4:



      define(Sat,Cat)dnl
      Saturday


      and this command:



      m4 day.m4


      to produce this output:



      Caturday


      As shown, m4 will not do this.



      Alternatively, is there a way to get sed to perform multiple substitutions simultaneously? That is, without passing over the file for each substitution.



      I can pipe a bunch of sed commands together or use a combination of sed and m4 and that's not so bad but if there's a convenient way to do this with one input file and one command that'd be preferable.



      Any other commonly available tool would be fine too.



      My goal is to use this for creating files from templates. Most of the tokens that are to be replaced are space separated.










      share|improve this question















      Is there a way to convince m4 to replace a macro in the middle of a word?



      I would like this file, day.m4:



      define(Sat,Cat)dnl
      Saturday


      and this command:



      m4 day.m4


      to produce this output:



      Caturday


      As shown, m4 will not do this.



      Alternatively, is there a way to get sed to perform multiple substitutions simultaneously? That is, without passing over the file for each substitution.



      I can pipe a bunch of sed commands together or use a combination of sed and m4 and that's not so bad but if there's a convenient way to do this with one input file and one command that'd be preferable.



      Any other commonly available tool would be fine too.



      My goal is to use this for creating files from templates. Most of the tokens that are to be replaced are space separated.







      text-processing sed macro m4






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Sep 17 '14 at 20:52









      Gilles

      524k12610471577




      524k12610471577










      asked Sep 16 '14 at 22:30









      Praxeolitic

      67711019




      67711019




















          2 Answers
          2






          active

          oldest

          votes

















          up vote
          0
          down vote













          It sounds like all that you need is:



          sed -e sub1 -e sub2 file


          Where sub has the form:



          s/sat/cat/g


          You could also put all your substitutions in a file and run it with:



          sed -f scriptfile filetomodify





          share|improve this answer



























            up vote
            0
            down vote













            Using patsubst()



            m4 provides a search-and-replace function, which can perform substitutions anywhere, including mid-word, called patsubst:




            Builtin: patsubst (string, regexp, [replacement])



            Searches string for matches of regexp, and substitutes replacement for each match.




            This doesn't involve setting up a new definition, so it can't be applied by default to all future input. Instead, you'll have to "sandwich" the full input text inside the function call:



            patsubst(dnl
            [...]
            Saturday
            [...]
            ,`Sat',`Cat')dnl


            Using changeword()



            m4 also provides changeword:




            A file being processed by m4 is split into quoted strings, words (potential macro names) and simple tokens (any other single character). Initially a word is defined by the following regular expression:



            [_a-zA-Z][_a-zA-Z0-9]*


            Using changeword, you can change this regular expression:




            Unfortunately, the changeword function is non-standard. It's only available if you requested it with --enable-changeword at compile time.



            With it enabled, you could eg. force m4 to only accept three-letter words.



            define(`Sat',`Cat')dnl
            changeword(`[A-Za-z][a-z]?[a-z]?')dnl
            Saturday


            But changeword has additional problems:




            regex must obey the constraint that every prefix of the desired final pattern is also accepted by the regular expression.



            [...]



            Tightening the lexical rules is less useful, because it will generally make some of the builtins unavailable.




            The above pattern would prevent further definitions (it only even recognises dnl because that's exactly three letters). So as well as being non-standard, it's not really suited to what you're trying to do.






            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',
              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%2f155949%2fcreate-files-from-templates-substitutions-in-middle-of-other-words%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













              It sounds like all that you need is:



              sed -e sub1 -e sub2 file


              Where sub has the form:



              s/sat/cat/g


              You could also put all your substitutions in a file and run it with:



              sed -f scriptfile filetomodify





              share|improve this answer
























                up vote
                0
                down vote













                It sounds like all that you need is:



                sed -e sub1 -e sub2 file


                Where sub has the form:



                s/sat/cat/g


                You could also put all your substitutions in a file and run it with:



                sed -f scriptfile filetomodify





                share|improve this answer






















                  up vote
                  0
                  down vote










                  up vote
                  0
                  down vote









                  It sounds like all that you need is:



                  sed -e sub1 -e sub2 file


                  Where sub has the form:



                  s/sat/cat/g


                  You could also put all your substitutions in a file and run it with:



                  sed -f scriptfile filetomodify





                  share|improve this answer












                  It sounds like all that you need is:



                  sed -e sub1 -e sub2 file


                  Where sub has the form:



                  s/sat/cat/g


                  You could also put all your substitutions in a file and run it with:



                  sed -f scriptfile filetomodify






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Feb 13 '15 at 22:23









                  sturgman

                  13315




                  13315






















                      up vote
                      0
                      down vote













                      Using patsubst()



                      m4 provides a search-and-replace function, which can perform substitutions anywhere, including mid-word, called patsubst:




                      Builtin: patsubst (string, regexp, [replacement])



                      Searches string for matches of regexp, and substitutes replacement for each match.




                      This doesn't involve setting up a new definition, so it can't be applied by default to all future input. Instead, you'll have to "sandwich" the full input text inside the function call:



                      patsubst(dnl
                      [...]
                      Saturday
                      [...]
                      ,`Sat',`Cat')dnl


                      Using changeword()



                      m4 also provides changeword:




                      A file being processed by m4 is split into quoted strings, words (potential macro names) and simple tokens (any other single character). Initially a word is defined by the following regular expression:



                      [_a-zA-Z][_a-zA-Z0-9]*


                      Using changeword, you can change this regular expression:




                      Unfortunately, the changeword function is non-standard. It's only available if you requested it with --enable-changeword at compile time.



                      With it enabled, you could eg. force m4 to only accept three-letter words.



                      define(`Sat',`Cat')dnl
                      changeword(`[A-Za-z][a-z]?[a-z]?')dnl
                      Saturday


                      But changeword has additional problems:




                      regex must obey the constraint that every prefix of the desired final pattern is also accepted by the regular expression.



                      [...]



                      Tightening the lexical rules is less useful, because it will generally make some of the builtins unavailable.




                      The above pattern would prevent further definitions (it only even recognises dnl because that's exactly three letters). So as well as being non-standard, it's not really suited to what you're trying to do.






                      share|improve this answer
























                        up vote
                        0
                        down vote













                        Using patsubst()



                        m4 provides a search-and-replace function, which can perform substitutions anywhere, including mid-word, called patsubst:




                        Builtin: patsubst (string, regexp, [replacement])



                        Searches string for matches of regexp, and substitutes replacement for each match.




                        This doesn't involve setting up a new definition, so it can't be applied by default to all future input. Instead, you'll have to "sandwich" the full input text inside the function call:



                        patsubst(dnl
                        [...]
                        Saturday
                        [...]
                        ,`Sat',`Cat')dnl


                        Using changeword()



                        m4 also provides changeword:




                        A file being processed by m4 is split into quoted strings, words (potential macro names) and simple tokens (any other single character). Initially a word is defined by the following regular expression:



                        [_a-zA-Z][_a-zA-Z0-9]*


                        Using changeword, you can change this regular expression:




                        Unfortunately, the changeword function is non-standard. It's only available if you requested it with --enable-changeword at compile time.



                        With it enabled, you could eg. force m4 to only accept three-letter words.



                        define(`Sat',`Cat')dnl
                        changeword(`[A-Za-z][a-z]?[a-z]?')dnl
                        Saturday


                        But changeword has additional problems:




                        regex must obey the constraint that every prefix of the desired final pattern is also accepted by the regular expression.



                        [...]



                        Tightening the lexical rules is less useful, because it will generally make some of the builtins unavailable.




                        The above pattern would prevent further definitions (it only even recognises dnl because that's exactly three letters). So as well as being non-standard, it's not really suited to what you're trying to do.






                        share|improve this answer






















                          up vote
                          0
                          down vote










                          up vote
                          0
                          down vote









                          Using patsubst()



                          m4 provides a search-and-replace function, which can perform substitutions anywhere, including mid-word, called patsubst:




                          Builtin: patsubst (string, regexp, [replacement])



                          Searches string for matches of regexp, and substitutes replacement for each match.




                          This doesn't involve setting up a new definition, so it can't be applied by default to all future input. Instead, you'll have to "sandwich" the full input text inside the function call:



                          patsubst(dnl
                          [...]
                          Saturday
                          [...]
                          ,`Sat',`Cat')dnl


                          Using changeword()



                          m4 also provides changeword:




                          A file being processed by m4 is split into quoted strings, words (potential macro names) and simple tokens (any other single character). Initially a word is defined by the following regular expression:



                          [_a-zA-Z][_a-zA-Z0-9]*


                          Using changeword, you can change this regular expression:




                          Unfortunately, the changeword function is non-standard. It's only available if you requested it with --enable-changeword at compile time.



                          With it enabled, you could eg. force m4 to only accept three-letter words.



                          define(`Sat',`Cat')dnl
                          changeword(`[A-Za-z][a-z]?[a-z]?')dnl
                          Saturday


                          But changeword has additional problems:




                          regex must obey the constraint that every prefix of the desired final pattern is also accepted by the regular expression.



                          [...]



                          Tightening the lexical rules is less useful, because it will generally make some of the builtins unavailable.




                          The above pattern would prevent further definitions (it only even recognises dnl because that's exactly three letters). So as well as being non-standard, it's not really suited to what you're trying to do.






                          share|improve this answer












                          Using patsubst()



                          m4 provides a search-and-replace function, which can perform substitutions anywhere, including mid-word, called patsubst:




                          Builtin: patsubst (string, regexp, [replacement])



                          Searches string for matches of regexp, and substitutes replacement for each match.




                          This doesn't involve setting up a new definition, so it can't be applied by default to all future input. Instead, you'll have to "sandwich" the full input text inside the function call:



                          patsubst(dnl
                          [...]
                          Saturday
                          [...]
                          ,`Sat',`Cat')dnl


                          Using changeword()



                          m4 also provides changeword:




                          A file being processed by m4 is split into quoted strings, words (potential macro names) and simple tokens (any other single character). Initially a word is defined by the following regular expression:



                          [_a-zA-Z][_a-zA-Z0-9]*


                          Using changeword, you can change this regular expression:




                          Unfortunately, the changeword function is non-standard. It's only available if you requested it with --enable-changeword at compile time.



                          With it enabled, you could eg. force m4 to only accept three-letter words.



                          define(`Sat',`Cat')dnl
                          changeword(`[A-Za-z][a-z]?[a-z]?')dnl
                          Saturday


                          But changeword has additional problems:




                          regex must obey the constraint that every prefix of the desired final pattern is also accepted by the regular expression.



                          [...]



                          Tightening the lexical rules is less useful, because it will generally make some of the builtins unavailable.




                          The above pattern would prevent further definitions (it only even recognises dnl because that's exactly three letters). So as well as being non-standard, it's not really suited to what you're trying to do.







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Nov 27 at 17:30









                          JigglyNaga

                          3,529828




                          3,529828



























                              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%2f155949%2fcreate-files-from-templates-substitutions-in-middle-of-other-words%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

                              How to check contact read email or not when send email to Individual?

                              Bahrain

                              Postfix configuration issue with fips on centos 7; mailgun relay