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

sou*_*els 3 linux bash shell scripting cygwin

在我的Cygwin和我的Linux盒子(Debian)上,我遇到了同样的问题:

我正在使用某种格式化ID的shell脚本,我想在斜杠出现(/)之前添加反斜杠().

我的sed脚本在我的终端上运行良好:

# export someid="314-12345/08"
# echo "${someid}" | sed 's/\//\\\//'
Run Code Online (Sandbox Code Playgroud)

输出:

314-12345\/08
Run Code Online (Sandbox Code Playgroud)

但是,如果我运行命令替换不是很好:

# someidformatted=`echo "${someid}" | sed 's/\//\\\//'`
sed: -e expression #1, char 9: unknown option to `s'
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?

先感谢您.

Grz*_*zki 13

没有义务使用/作为sed的分隔符.

s/a/c/
Run Code Online (Sandbox Code Playgroud)

可能会变成

s#a#c#
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下:

someidformatted=`echo "${someid}" | sed 's#\/#\\\/#'`
Run Code Online (Sandbox Code Playgroud)

会做的.

我只能猜测问题是由于某些缺乏/逃避造成的.


Vil*_*ari 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'
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到\\转向的事件发生了\.添加更多反斜杠有效,但我更喜欢这种$(command)形式:

# someidformatted=$(echo "${someid}" | sed 's/\//\\\//')
Run Code Online (Sandbox Code Playgroud)