Shell脚本。我的脚本中的命令替换问题

时间:2009-07-13 10:00:16

标签: linux bash shell scripting cygwin

在我的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'

我在这里缺少什么?

提前谢谢。

2 个答案:

答案 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/\//\\\//')