使用 sed 转义正斜杠和反斜杠

使用 sed 转义正斜杠和反斜杠

我有以下字符串:/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

这是相当干净的。

相关内容