我有以下字符串: /tmp/test/folder1/test.txt
我希望使用sed以替代/的\/-例如:
\/tmp\/test\/folder1\/test.txt
Run Code Online (Sandbox Code Playgroud)
所以我发出:
echo "/tmp/test/folder1/test.txt" | sed "s/\//\\\\//g"
Run Code Online (Sandbox Code Playgroud)
虽然它返回:
sed: -e 表达式 #1, char 9: `s' 的未知选项
我正在逃避正斜杠和反斜杠 - 所以不确定我在这里哪里出错了
jim*_*mij 41
您需要分别转义(使用反斜杠\)所有替换的斜杠/和所有反斜杠\,因此:
$ echo "/tmp/test/folder1/test.txt" | sed 's/\//\\\//g'
\/tmp\/test\/folder1\/test.txt
Run Code Online (Sandbox Code Playgroud)
但这相当不可读。
但是,sed允许使用几乎任何字符作为分隔符而不是/,这在一个人想要替换斜杠/本身时特别有用,例如在您的情况下,因此使用例如分号;作为分隔符命令会变得更简单:
echo "/tmp/test/folder1/test.txt" | sed 's;/;\\/;g'
Run Code Online (Sandbox Code Playgroud)
其他情况:
如果想坚持使用斜杠作为分隔符并使用双引号,那么所有转义的反斜杠都必须再次转义以保留其文字值:
echo "/tmp/test/folder1/test.txt" | sed "s/\//\\\\\//g"
Run Code Online (Sandbox Code Playgroud)如果根本不需要引号,则需要另一个反斜杠:
echo "/tmp/test/folder1/test.txt" | sed s/\\//\\\\\\//g
Run Code Online (Sandbox Code Playgroud)或者,如果值在 (bash) shell 变量中:
var=/tmp/test/folder1/test.txt
$ echo "${var//\//\\\/}"
\/tmp\/test\/folder1\/test.txt
Run Code Online (Sandbox Code Playgroud)
第一个//开始参数扩展,表示用替换替换所有匹配项。下一个\/是/要匹配的转义,\\\/是一个转义,\然后是一个转义/作为替换。