我从 GnuWin32 下载了
sed.exe
并尝试在我的批处理脚本中使用它。但是,sed
返回的字符串与我预期的不同。
我尝试使用不同的分隔符并使用
-b
标志,但没有任何反应。
我的批处理脚本:
@echo off
set "scriptDir=%~dp0"
"%scriptDir%sed\sed.exe" "s|Windows XP (x64, cloud).vmdk|%scriptDir%Windows XP (x64, cloud).vmdk|" "Windows XP (x64, cloud).vmx"
我希望在更改后的行中写下什么:
scsi0:0.fileName = "C:\Users\Maksio\OneDrive\Windows XP (x64)\Windows XP (x64, cloud).vmdk"
实际写的是:
scsi0:0.fileName = "C:SERSMAKSIOONEDRIVEWINDOWS XP (X64)WINDOWS XP (X64, CLOUD).VMDK"
阅读 sed 手册是个好主意,尤其是但不仅仅是章节 3.3 s 命令。反斜杠字符
\
在搜索和替换正则表达式中具有特殊含义。每个反斜杠必须再转义一个反斜杠才能被解释为文字字符。
还需要使用
&
对脚本目录路径中的每个 \
进行转义,以将其解释为文字与符号。
这在 sed 手册中进行了描述,段落如下:
要在最终替换中包含文字 \、& 或换行符,请务必在替换中所需的 \、& 或换行符前面加上 \。
因此批处理文件应为:
@echo off
set "scriptDir=%~dp0"
set "EscapedScriptDir=%scriptDir:\=\\%"
set "EscapedScriptDir=%EscapedScriptDir:&=\&%"
"%scriptDir%sed\sed.exe" "s|Windows XP (x64, cloud).vmdk|%EscapedScriptDir%Windows XP (x64, cloud).vmdk|" "Windows XP (x64, cloud).vmx"
在命令提示符窗口中运行
set /?
并阅读整个输出帮助,了解此处使用的两个字符串替换的说明,以便在脚本目录路径中用一个反斜杠转义每个反斜杠,并用一个反斜杠转义每个与号。