我有一个字符串/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//\//\\\/}"