我试过这个:
PATH="/user/dj/a/mydir"
PATH_FORMAT=`echo "${PATH}" | sed 's/\//\\\//'`
但它只替换第一个“/”。我希望得到的 PATH_FORMAT 值为:
"\/user\/dj\/a\/mydir"
我怎样才能做到这一点?
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
如果您正在运行 shell 脚本,请使用 Bash 的参数扩展:
MYPATH="/user/dj/a/mydir"
PATH_FORMAT=${MYPATH////\\/}
替换由替换所有模式的语法${parameter}
扩展。可以是正则表达式。在你的情况下,是:。替换为:。${parameter//pattern/string}
parameter
pattern
pattern
/
string
\\/
此外,避免在变量中存储一些东西PATH
,因为它可能被系统使用——除非你想修改系统的路径变量。
引用gnu.org的参数扩展手册:
${参数/模式/字符串}
该模式被扩展以产生一个模式,就像在文件名扩展中一样。参数被扩展,模式与其值的最长匹配被替换为字符串。根据下面描述的规则执行匹配(请参阅模式匹配)。如果 pattern 以 开头
/
,则所有匹配的 pattern 都被替换为 string。通常只替换第一场比赛。如果模式以 开头#
,它必须匹配参数扩展值的开头。如果模式以%
,它必须在参数扩展值的末尾匹配。如果 string 为 null,则删除 pattern 的匹配项,并且可以省略 / 后面的 pattern。如果启用了 nocasematch shell 选项(参见 Shopt Builtin 中 shopt 的描述),则执行匹配时不考虑字母字符的大小写。如果 parameter 是@
or*
,则依次对每个位置参数应用替换操作,展开是结果列表。@
如果 parameter 是一个以or为下标的数组变量*
,则替换操作依次应用于数组的每个成员,展开是结果列表。
sed "s%/%\\\\\\/%g"
. 就如此容易