我有以下字符串:/tmp/test/folder1/test.txt
我希望用 来代替sed
-例如:/
\/
\/tmp\/test\/folder1\/test.txt
所以我发出:
echo "/tmp/test/folder1/test.txt" | sed "s/\//\\\\//g"
虽然它返回:
sed:-e 表达式 #1,字符 9:“s”的未知选项
我正在转义正斜杠和反斜杠 - 所以不确定我在这里哪里出了问题
答案1
您需要分别转义(使用反斜杠\
)所有替换的斜杠/
和所有反斜杠,因此:\
$ echo "/tmp/test/folder1/test.txt" | sed 's/\//\\\//g'
\/tmp\/test\/folder1\/test.txt
但这是相当不可读的。
但是,sed
允许使用几乎任何字符作为分隔符而不是/
,当您想要替换斜杠/
本身时(如您的情况),这特别有用,因此使用例如分号;
作为分隔符,命令会变得更简单:
echo "/tmp/test/folder1/test.txt" | sed 's;/;\\/;g'
其他案例:
如果想坚持使用斜杠作为分隔符并使用双引号,那么所有转义的反斜杠都必须再转义一次以保留其字面值:
echo "/tmp/test/folder1/test.txt" | sed "s/\//\\\\\//g"
如果根本不需要引号,那么还需要另一个反斜杠:
echo "/tmp/test/folder1/test.txt" | sed s/\\//\\\\\\//g
答案2
或者,如果该值位于 (bash) shell 变量中:
var=/tmp/test/folder1/test.txt
$ echo "${var//\//\\\/}"
\/tmp\/test\/folder1\/test.txt
第一次//
开始参数扩展,说要替换全部与替换品相匹配。接下来是要匹配的\/
转义符,并且 the是一个转义符,后面跟着一个转义符作为替换。/
\\\/
\
/
答案3
最终的解决方案将是这样的:
$ sed 's:/:\\/:g' <<<"$str"
\/tmp\/test\/folder1\/test.txt
但要解释一下如何到达那里:
是的,你错过了一个反斜杠:
$ str='/tmp/test/folder1/test.txt'
$ sed "s/\//\\\\\//g" <<<"$str"
\/tmp\/test\/folder1\/test.txt
我希望有一个空间能够说清楚:
$ sed "s/\//\\\\ \//g" <<<"$str"
\ /tmp\ /test\ /folder1\ /test.txt
但是,如果您要将 sed 分隔符更改为:
(例如):
$ sed "s:\/:\\\\\/:g" <<<"$str"
\/tmp\/test\/folder1\/test.txt
但这并不严格正确,因为(现在不是特殊的)/
不需要scaping:
$ sed "s:/:\\\\/:g" <<<"$str"
\/tmp\/test\/folder1\/test.txt
而且,如果您使用单引号而不是双引号,shell 不会将双引号更改\\
为一,因此 less\
是正确的:
$ sed 's:/:\\/:g' <<<"$str"
\/tmp\/test\/folder1\/test.txt
这是相当干净的。