在我的Cygwin和我的Linux盒子(Debian)上,我遇到了同样的问题:
我正在使用某种格式化ID的shell脚本,我想在斜杠出现之前添加反斜杠()(/)。
我的sed脚本在我的终端上运行良好:
# export someid="314-12345/08"
# echo "${someid}" | sed 's/\//\\\//'
输出:
314-12345\/08
但是,如果我运行command substitution:
,那就不一样了# someidformatted=`echo "${someid}" | sed 's/\//\\\//'`
sed: -e expression #1, char 9: unknown option to `s'
我在这里缺少什么?
提前谢谢。
答案 0 :(得分:13)
没有义务使用/作为sed的分隔符。
s/a/c/
可能会成为
s#a#c#
所以在你的情况下:
someidformatted=`echo "${someid}" | sed 's#\/#\\\/#'`
可以胜任。
我只能猜测问题是由某些缺少/转义引起的。
答案 1 :(得分:8)
这是发生了什么。从bash(1)手册页,强调我的:
当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后跟$,'或\。第一个不带反斜杠的反引号终止命令替换。使用$(命令)表单时,括号之间的所有字符组成命令;没有人特别对待。
因此,与普通命令相比,命令替换需要更多的反斜杠。
您可以通过设置set -x
:
# someidformatted=`echo "${someid}" | sed 's/\//\\\//'`
++ echo 314-12345/08
++ sed 's/\//\\//'
sed: 1: "s/\//\\//": bad flag in substitute command: '/'
+ someidformatted=
# someidformatted=$(echo "${someid}" | sed 's/\//\\\//')
++ echo 314-12345/08
++ sed 's/\//\\\//'
+ someidformatted='314-12345\/08'
因此,您可以看到\\
的出现转向\
。添加更多反斜杠有效,但我更喜欢$(command)
形式:
# someidformatted=$(echo "${someid}" | sed 's/\//\\\//')