Windows下用sed修改文本文件为何丢失所有反斜杠及部分字符?
问题分析与解决
你的问题根源在于Windows路径中的反斜杠\被GNU sed解析成了转义字符,尤其是\U触发了sed的大写转换功能,导致路径中的反斜杠消失,同时后续字符被强制转大写。
解决方案
修改批处理脚本,先将路径中的反斜杠转义为\\(sed需要两个反斜杠才能识别为一个实际的反斜杠),再传入sed命令:
@echo off set "scriptDir=%~dp0" :: 将路径中的反斜杠替换为双反斜杠,避免被sed转义 set "escapedDir=%scriptDir:\=\\%" "%scriptDir%sed\sed.exe" "s|Windows XP (x64, cloud).vmdk|%escapedDir%Windows XP (x64, cloud).vmdk|" "Windows XP (x64, cloud).vmx"
如果路径中包含特殊字符(比如感叹号),建议启用延迟扩展避免解析错误:
@echo off setlocal enabledelayedexpansion set "scriptDir=%~dp0" set "escapedDir=!scriptDir:\=\\!" "%scriptDir%sed\sed.exe" "s|Windows XP (x64, cloud).vmdk|!escapedDir!Windows XP (x64, cloud).vmdk|" "Windows XP (x64, cloud).vmx" endlocal
为什么原脚本会出错?
- 当
%scriptDir%展开为C:\Users\Maksio\OneDrive\Windows XP (x64)\时,sed会把\U识别为开启大写转换的转义序列,导致后续的sers被转为SERS,\Maksio中的反斜杠被忽略,Maksio转为MAKSIO,以此类推。 - 转义后的双反斜杠
\\会被sed解析为单个\,既保留了路径分隔符,又不会触发转义功能。
内容的提问来源于stack exchange,提问作者magnificent papyrus
相关产品推荐
相关产品推荐

