用。。。来代替 ”\/”

用。。。来代替 ”\/”

我有一个字符串/tmp/testing我想用它替换\/tmp\/testing

sed工作正常如下:

echo testdir=/tmp/testing | sed 's/\//\\\//g'
testdir=\/tmp\/testing

但是,如果我尝试将其放入稍后要使用的变量中,则会收到此错误:

myvar=`echo testdir=/tmp/testing | sed 's/\//\\\//g'`
sed: -e expression #1, char 9: unknown option to `s'

有什么想法吗?

答案1

反引号`...`增加了一个间接级别,需要另一组\转义。如果您使用$( ... )它,它会正常工作并按预期运行:

myvar=$(echo testdir=/tmp/testing | sed 's/\//\\\//g')
echo "$myvar"
testdir=\/tmp\/testing

如果您坚持使用反引号,这将起作用:

myvar=`echo testdir=/tmp/testing | sed 's/\//\\\\\//g'`
echo "$myvar"
testdir=\/tmp\/testing

答案2

尝试这个

$ echo testdir=/tmp/testing | sed 's/\//\\\//g'
testdir=\/tmp\/testing

在变量中

var=$(echo testdir=/tmp/testing | sed 's/\//\\\//g')

答案3

反引号内的反斜杠是某种特殊情况。这又是一个永远不要使用反引号的原因$(cmd)http://mywiki.wooledge.org/BashFAQ/082

您可以将引用设为很多当您的模式包含/.例如

myvar=$(printf '%s' "$oldpath" | sed 'sX/X\\/Xg')

或者,如果您知道自己正在使用 bash,那么不要使用 来printf避免echo修改数据(例如,如果文件名以 开头-),而只需使用纯 bash 字符串操作。

myvar=${foo//\//\\/}   # sed 'sX/X\\/Xg'

这更难以阅读,因为没有其他方法可以/作为分隔符。更好的是,/在模式的开头意味着替换所有出现的情况。此外,模式和替换的处理方式也不同。没有/像 sed 使用的尾随,因此您不需要/在替换字符串中转义 es。不管怎样,它在很多方面与 sed 不同,这意味着你应该留下评论。

它在性能和稳健性方面“更好”,但在可读性或可移植性方面却没有。这与 shell 编程课程差不多。

答案4

您可以使用bash变量扩展|替换

testdir="${testdir//\//\\\/}"

相关内容