【发布时间】:2021-07-26 06:18:35
【问题描述】:
我正在尝试编写一个小脚本来替换 Windows 路径中的值。 使用一些 sed 来替换它很好(我有正确的变量):
echo %path% | sed "s/jvms\\[^^\]\+/jvms\\%1/"
这很好用。但是,我想将其分配给一个新的路径变量。这样做的方法应该是
for /f "delims=" %%B in ('echo %path% ^| sed "s/windows/C64/"' ) do call set replaced=%%B
echo %replaced%
请注意 |被逃脱,因为它应该。但是,新的replaced 变量将所有分号都替换为空格。因此,echo %replaced% 的输出类似于c:\C64 c:\program files c:\otherdirectory 而不是c:\C64;c:\program files;c:\otherdirectory
当我不使用任何 sed 时,这已经发生了,所以
for /f "delims=" %%B in ('echo %path%' ) do call set replaced=%%B
echo %replaced%
然后返回c:\Windows c:\program files c:\otherdirectory
如何确保分号不被空格代替?
【问题讨论】:
-
您使用 cmd.exe 而不是 PowerShell 有什么特别的原因吗?
-
是否有任何理由使用
sed将环境变量PATH中的字符串替换为另一个字符串,而不是使用cmd 内部命令set进行字符串替换?打开command prompt,运行set /?并阅读输出帮助说明如何使用此命令将环境变量值中所有出现的字符串替换为另一个不区分大小写的字符串。 Windows 命令处理器甚至支持使用set语法对命令行中任意位置的环境变量的字符串值进行字符串替换。 -
这些 cmets 都与问题无关。为什么是cmd?为什么不?用 set 替换很难做到,因为它确实不支持正则表达式,所以替换任意的未知值并非易事。
-
为什么不...因为 [cmd],因此是 [batch-file],没有任何正则表达式支持,(除非您引入了支持的工具)。如果您需要正则表达式支持,请首先选择可以这样做的东西,例如内置的 [powershell] 控制台。 cmets 与问题无关,它们是建议您尝试以非标准方式完成任务。虽然您可能已经意识到这一点,并且想要努力做到这一点,但所有未来的读者都不会这样做,因此,即使不是您自己,cmets 和我的回答也可能对他们有用。
-
“为什么是 cmd?为什么不呢?”因为有更好的工具可用。从长远来看,在学习使用高级工具上投入的时间将得到回报。此外,让其他读者知道他们不必为神秘的 cmd.exe “语言”及其各种解析怪癖(您在这个问题中遇到的其中一个)而苦苦挣扎。
标签: windows shell batch-file cmd