1

我在 Windows 上使用 Cmder 并尝试执行以下语句:

echo "c:\Sources\" + (echo "Modules/ASR/branches/1.9" | sed -e "s|Modules/||")

每当我发出该命令时,我都会收到烦人的错误

sed: -e expression #1, char 13: unknown option to `s'

但是当我自己运行 sed 命令时:

(echo "Modules/ASR/branches/1.9" | sed -e "s|Modules/||")

它神奇地起作用。谁能解释我做错了什么?

编者注:这个问题最初被错误标记为,而描述的症状暗示

4

1 回答 1

2

问题中的错误消息是由于 windowscmd将命令与sed 命令拆分|并添加右括号。)

cmd等效于“命令替换”for /f后跟单引号之间的命令,管道必须用^

for /f %x in ('echo "Modules/ASR/branches/1.9" ^| sed -e "s|Modules/||" ') do @echo "c:\Sources\"%~x

或者在脚本中使用时,百分比必须加倍

for /f %%x in ('echo "Modules/ASR/branches/1.9" ^| sed -e "s|Modules/||" ') do @echo "c:\Sources\"%%~x

否则扩展允许替换模式%var:pat=repl%

set mypath=Modules/ASR/branches/1.9
echo "c:\Sources\"%mypath:Modules/=%

相当于 bash

echo 'c:\Sources\'"$(echo "Modules/ASR/branches/1.9" | sed -e "s|Modules/||")"

也为了避免启动新进程,这可以通过变量扩展#来删除最短前缀来完成。

mypath="Modules/ASR/branches/1.9"
echo 'c:\Sources\'"${mypath//Modules\/}"
于 2017-06-06T12:04:46.340 回答