Escaping exclamation marks with delayed expansion
I have a batch file I'm using to search for a piece of text and replace it with another. It works, but what's happening is that when the 'new' file is created, anything after an exclamation mark is deleted.
So original file
Hello! I have some cheese
Just becomes
Hello
Although the text I am trying to replace is fine.
I understand that since I'm using delayed expansion I need to somehow escape the exclamation marks with ^^! but can't figure out where to do this. Adding it at the echo just echoes the ^^! literally.
Any help would be appreciated.
set "rootname=Common Filename"
set "replace="old">"
set "replaced="new">"
set "source="%rootname%_unqiue_suffix.txt""
set "target=Fixed%SOURCE%"
setlocal enableDelayedExpansion
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
set "line=%%b"
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
)
) > %target%
endlocal
batch-file cmd findstr
add a comment |
I have a batch file I'm using to search for a piece of text and replace it with another. It works, but what's happening is that when the 'new' file is created, anything after an exclamation mark is deleted.
So original file
Hello! I have some cheese
Just becomes
Hello
Although the text I am trying to replace is fine.
I understand that since I'm using delayed expansion I need to somehow escape the exclamation marks with ^^! but can't figure out where to do this. Adding it at the echo just echoes the ^^! literally.
Any help would be appreciated.
set "rootname=Common Filename"
set "replace="old">"
set "replaced="new">"
set "source="%rootname%_unqiue_suffix.txt""
set "target=Fixed%SOURCE%"
setlocal enableDelayedExpansion
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
set "line=%%b"
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
)
) > %target%
endlocal
batch-file cmd findstr
1
there's neither enableDelayedExpansion norfor /fin DOS. The Windows cmd is not DOS
– phuclv
Nov 12 '18 at 14:44
Apologies. I'm not a coder or programmer and so I get things confused sometimes.
– SwagBag
Nov 12 '18 at 15:05
add a comment |
I have a batch file I'm using to search for a piece of text and replace it with another. It works, but what's happening is that when the 'new' file is created, anything after an exclamation mark is deleted.
So original file
Hello! I have some cheese
Just becomes
Hello
Although the text I am trying to replace is fine.
I understand that since I'm using delayed expansion I need to somehow escape the exclamation marks with ^^! but can't figure out where to do this. Adding it at the echo just echoes the ^^! literally.
Any help would be appreciated.
set "rootname=Common Filename"
set "replace="old">"
set "replaced="new">"
set "source="%rootname%_unqiue_suffix.txt""
set "target=Fixed%SOURCE%"
setlocal enableDelayedExpansion
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
set "line=%%b"
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
)
) > %target%
endlocal
batch-file cmd findstr
I have a batch file I'm using to search for a piece of text and replace it with another. It works, but what's happening is that when the 'new' file is created, anything after an exclamation mark is deleted.
So original file
Hello! I have some cheese
Just becomes
Hello
Although the text I am trying to replace is fine.
I understand that since I'm using delayed expansion I need to somehow escape the exclamation marks with ^^! but can't figure out where to do this. Adding it at the echo just echoes the ^^! literally.
Any help would be appreciated.
set "rootname=Common Filename"
set "replace="old">"
set "replaced="new">"
set "source="%rootname%_unqiue_suffix.txt""
set "target=Fixed%SOURCE%"
setlocal enableDelayedExpansion
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
set "line=%%b"
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
)
) > %target%
endlocal
batch-file cmd findstr
batch-file cmd findstr
edited Nov 12 '18 at 14:45
phuclv
14.4k851212
14.4k851212
asked Nov 12 '18 at 14:23
SwagBag
82
82
1
there's neither enableDelayedExpansion norfor /fin DOS. The Windows cmd is not DOS
– phuclv
Nov 12 '18 at 14:44
Apologies. I'm not a coder or programmer and so I get things confused sometimes.
– SwagBag
Nov 12 '18 at 15:05
add a comment |
1
there's neither enableDelayedExpansion norfor /fin DOS. The Windows cmd is not DOS
– phuclv
Nov 12 '18 at 14:44
Apologies. I'm not a coder or programmer and so I get things confused sometimes.
– SwagBag
Nov 12 '18 at 15:05
1
1
there's neither enableDelayedExpansion nor
for /f in DOS. The Windows cmd is not DOS– phuclv
Nov 12 '18 at 14:44
there's neither enableDelayedExpansion nor
for /f in DOS. The Windows cmd is not DOS– phuclv
Nov 12 '18 at 14:44
Apologies. I'm not a coder or programmer and so I get things confused sometimes.
– SwagBag
Nov 12 '18 at 15:05
Apologies. I'm not a coder or programmer and so I get things confused sometimes.
– SwagBag
Nov 12 '18 at 15:05
add a comment |
1 Answer
1
active
oldest
votes
To avoid loss of exclamation marks, enable delayed expansion only when it is really needed and expand normal % variables and for meta-variables only when delayed expansion is disabled:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "rootname=Common Filename"
set "replace="old">"
set "replaced="new">"
set "source=%rootname%_unqiue_suffix.txt"
set "target=Fixed%source%"
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%source%"') do (
set "line=%%b"
setlocal EnableDelayedExpansion
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
endlocal
)
) > "%target%"
endlocal
This code still causes trouble in case the variables replace and replaced contain !-signs, because they are percent-expanded.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
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: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
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
});
}
});
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%2fstackoverflow.com%2fquestions%2f53264174%2fescaping-exclamation-marks-with-delayed-expansion%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
To avoid loss of exclamation marks, enable delayed expansion only when it is really needed and expand normal % variables and for meta-variables only when delayed expansion is disabled:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "rootname=Common Filename"
set "replace="old">"
set "replaced="new">"
set "source=%rootname%_unqiue_suffix.txt"
set "target=Fixed%source%"
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%source%"') do (
set "line=%%b"
setlocal EnableDelayedExpansion
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
endlocal
)
) > "%target%"
endlocal
This code still causes trouble in case the variables replace and replaced contain !-signs, because they are percent-expanded.
add a comment |
To avoid loss of exclamation marks, enable delayed expansion only when it is really needed and expand normal % variables and for meta-variables only when delayed expansion is disabled:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "rootname=Common Filename"
set "replace="old">"
set "replaced="new">"
set "source=%rootname%_unqiue_suffix.txt"
set "target=Fixed%source%"
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%source%"') do (
set "line=%%b"
setlocal EnableDelayedExpansion
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
endlocal
)
) > "%target%"
endlocal
This code still causes trouble in case the variables replace and replaced contain !-signs, because they are percent-expanded.
add a comment |
To avoid loss of exclamation marks, enable delayed expansion only when it is really needed and expand normal % variables and for meta-variables only when delayed expansion is disabled:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "rootname=Common Filename"
set "replace="old">"
set "replaced="new">"
set "source=%rootname%_unqiue_suffix.txt"
set "target=Fixed%source%"
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%source%"') do (
set "line=%%b"
setlocal EnableDelayedExpansion
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
endlocal
)
) > "%target%"
endlocal
This code still causes trouble in case the variables replace and replaced contain !-signs, because they are percent-expanded.
To avoid loss of exclamation marks, enable delayed expansion only when it is really needed and expand normal % variables and for meta-variables only when delayed expansion is disabled:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "rootname=Common Filename"
set "replace="old">"
set "replaced="new">"
set "source=%rootname%_unqiue_suffix.txt"
set "target=Fixed%source%"
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%source%"') do (
set "line=%%b"
setlocal EnableDelayedExpansion
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
endlocal
)
) > "%target%"
endlocal
This code still causes trouble in case the variables replace and replaced contain !-signs, because they are percent-expanded.
edited Nov 12 '18 at 15:18
answered Nov 12 '18 at 15:04
aschipfl
18.1k82654
18.1k82654
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- 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%2fstackoverflow.com%2fquestions%2f53264174%2fescaping-exclamation-marks-with-delayed-expansion%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
1
there's neither enableDelayedExpansion nor
for /fin DOS. The Windows cmd is not DOS– phuclv
Nov 12 '18 at 14:44
Apologies. I'm not a coder or programmer and so I get things confused sometimes.
– SwagBag
Nov 12 '18 at 15:05