Create files from templates, substitutions in middle of other words
Clash 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.
text-processing sed macro m4
add a comment |
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.
text-processing sed macro m4
add a comment |
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.
text-processing sed macro m4
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
text-processing sed macro m4
edited Sep 17 '14 at 20:52
Gilles
524k12610471577
524k12610471577
asked Sep 16 '14 at 22:30
Praxeolitic
67711019
67711019
add a comment |
add a comment |
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
add a comment |
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.
add a comment |
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
add a comment |
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
add a comment |
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
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
answered Feb 13 '15 at 22:23
sturgman
13315
13315
add a comment |
add a comment |
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.
add a comment |
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.
add a comment |
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.
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.
answered Nov 27 at 17:30
JigglyNaga
3,529828
3,529828
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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