为啥命令的 windows shell 替换分号?

Posted

技术标签:

【中文标题】为啥命令的 windows shell 替换分号?【英文标题】:Why does windows shell's for command replace semicolons?为什么命令的 windows shell 替换分号? 【发布时间】: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 “语言”及其各种解析怪癖(您在这个问题中遇到的其中一个)而苦苦挣扎。 【参考方案1】:

cmd 解析器将分号(以及逗号、等号和制表符)视为标记分隔符。 for /f 命令经过一轮解析,其中分隔符被替换为空格。例如,for /f "delims=" %%B in ('echo a;b==c,,,d') do echo %%B 的结果是 a b c d

避免替换的一种方法是引用参数,然后取消引用 %%~B 标记。对于第二个示例,for /f "delims=" %%B in ('echo "%path%"' ) do set "replaced=%%~B" 将按预期工作。

【讨论】:

谢谢!我很怀疑,但不知道如何避免它。在此期间我已经解决了这个问题,但这对于了解未来至关重要。【参考方案2】:

正如 cmets 中已经提到的,此任务不需要第三方流编辑器或查找和替换实用程序。您可以使用变量扩展和替换,这也将否定for-loop 的需要:

例子:

Set "replaced=%PATH::\Windows=:\C64%"

如果替换字符串作为第一个输入参数被接收,那么您将使用延迟变量扩展。

例子:

@Echo Off
SetLocal EnableDelayedExpansion
Set "replaced=!PATH::\Windows=:\%~1!"
Echo %replaced%

【讨论】:

这不是这个问题的答案。 正确的@KoosGadellaa,它是一种无需解决不需要解决的问题即可实现所需结果的解决方案!

以上是关于为啥命令的 windows shell 替换分号?的主要内容,如果未能解决你的问题,请参考以下文章

shell中的括号作用

shell中各种括号的作用()(())[][[]]{}

shell中各种括号的作用()(())[][[]]{}

Shell中各种括号的作用

shell 中各种括号的作用()(())[][[]]{}

shell 中()[]{}(())[[]]等各种括号的使用