【问题标题】:sed -e unknown option to `s' - Not a delimiter issuesed -e `s' 的未知选项 - 不是分隔符问题
【发布时间】:2017-06-06 11:40:54
【问题描述】:

我在 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/||")

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

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

【问题讨论】:

  • 看起来 ) 是你的修饰符......为你的方便发明一个不存在的语法不是要走的路。
  • 您不必在 Cmder 的引号中转义反斜杠吗?现在看起来你所有的引用都搞砸了。
  • @KarolyHorvath 我需要在正确的方向上多一点推动。根据您的说法,我知道我做错了什么,但不知道如何前进。
  • @123 Cmder 对此没有问题
  • @WeyensL 猜猜不是那样。

标签: bash cmd sed cmd cmder


【解决方案1】:

问题中的错误消息是由于 windows cmd 将命令与 | 拆分并将右括号 ) 添加到 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\/}"

【讨论】:

  • @123 你的意思是echo `echo \`echo ok\``
  • @123 是的,正如我所写的那样,它可以工作,但是对于每个级别,特殊字符都必须转义,而 echo "$(echo "$(echo "ok")")" 甚至双引号也会嵌套而不转义
  • 是的,嵌套$() 要容易得多,但是说你不能嵌套反引号是不正确的。
猜你喜欢
  • 2022-12-28
  • 2018-03-11
  • 2021-02-07
  • 2014-04-06
  • 2020-11-25
  • 2018-04-25
  • 2013-03-08
  • 2014-12-08
  • 2013-01-19
相关资源
最近更新 更多