5

我试过这个:

PATH="/user/dj/a/mydir"
PATH_FORMAT=`echo "${PATH}" | sed 's/\//\\\//'`

但它只替换第一个“/”。我希望得到的 PATH_FORMAT 值为:

"\/user\/dj\/a\/mydir"

我怎样才能做到这一点?

4

3 回答 3

7

g在您的替代命令中添加一个标志:

echo "${PATH}" | sed 's/\//\\//g'

或者更具可读性,根据评论中的Jonathan Wakely

echo "${PATH}" | sed 's:/:\\/:g'

要实现您在问题中描述的内容,您还需要一个反斜杠:

echo /user/dj/a/mydir | sed 's:/:\\\/:g'

输出:

\/user\/dj\/a\/mydir
于 2012-12-20T11:26:54.190 回答
3

如果您正在运行 shell 脚本,请使用 Bash 的参数扩展:

MYPATH="/user/dj/a/mydir"
PATH_FORMAT=${MYPATH////\\/}

替换由替换所有模式的语法${parameter}扩展。可以是正则表达式。在你的情况下,是:。替换为:。${parameter//pattern/string}parameterpatternpattern/string\\/

此外,避免在变量中存储一些东西PATH,因为它可能被系统使用——除非你想修改系统的路径变量。

引用gnu.org的参数扩展手册:

${参数/模式/字符串}

该模式被扩展以产生一个模式,就像在文件名扩展中一样。参数被扩展,模式与其值的最长匹配被替换为字符串。根据下面描述的规则执行匹配(请参阅模式匹配)。如果 pattern 以 开头/,则所有匹配的 pattern 都被替换为 string。通常只替换第一场比赛。如果模式以 开头#,它必须匹配参数扩展值的开头。如果模式以%,它必须在参数扩展值的末尾匹配。如果 string 为 null,则删除 pattern 的匹配项,并且可以省略 / 后面的 pattern。如果启用了 nocasematch shell 选项(参见 Shopt Builtin 中 shopt 的描述),则执行匹配时不考虑字母字符的大小写。如果 parameter 是@or *,则依次对每个位置参数应用替换操作,展开是结果列表。@如果 parameter 是一个以or为下标的数组变量*,则替换操作依次应用于数组的每个成员,展开是结果列表。

于 2019-09-13T12:12:21.043 回答
-2
sed "s%/%\\\\\\/%g"

. 就如此容易

于 2013-10-31T18:38:34.160 回答