Windows 上的 sed 返回奇怪的字符串

问题描述 投票:0回答:1

我从 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"

windows batch-file sed
1个回答
0
投票

阅读 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 /?
并阅读整个输出帮助,了解此处使用的两个字符串替换的说明,以便在脚本目录路径中用一个反斜杠转义每个反斜杠,并用一个反斜杠转义每个与号。

© www.soinside.com 2019 - 2024. All rights reserved.