Windows Cmder使用sed替换URL特殊字符报错问题求解
报错原因
- 核心问题是Windows Cmder的命令行解析规则与Linux shell存在差异,你使用的
's|'匹配内容'|'替换内容'|gi'写法属于Linux shell下的单引号截断拼接逻辑,Cmder无法正确识别。 - 当Cmder解析到第一个闭合单引号后,会把后续的
category=开头的内容识别为独立的可执行命令,因此触发了'category' 不是内部或外部命令的报错。 - 你无需中途截断单引号拼接固定的匹配/替换内容,当前用
|作为分隔符已经规避了特殊字符冲突,多余的单引号截断是导致报错的直接诱因。
解决方案
以下两种方案都可直接在Cmder中正常执行:
- 方案1:用双引号包裹整个sed替换表达式,Cmder对双引号的包裹识别兼容性更好:
sed -i "s|category=2fLShbTEL0cKrSR7J9S2hk&emailRedirect=Y|utm_source=marketingcloud&utm_medium=email&utm_campaign=p8%202021%20donutshop%20lifestyle&utm_content=primary%20cta&brand=Donut%20Shop&emailRedirect=Y|gi" *.html
- 方案2:用单引号包裹整个sed替换表达式,不要中途截断单引号:
sed -i 's|category=2fLShbTEL0cKrSR7J9S2hk&emailRedirect=Y|utm_source=marketingcloud&utm_medium=email&utm_campaign=p8%202021%20donutshop%20lifestyle&utm_content=primary%20cta&brand=Donut%20Shop&emailRedirect=Y|gi' *.html
- 如果你需要用变量传递匹配值和替换值,在Cmder中请使用Windows标准变量格式
%变量名%,放在双引号包裹的表达式内调用即可,不要使用Linux下的单引号拼接变量写法。
内容的提问来源于stack exchange,提问作者NewJackSwing4Ever
相关产品推荐
相关产品推荐

