sed中的转义反斜杠字符

sed中的转义反斜杠字符,sed,Sed,我需要修改一些Windows路径 比如说, D:\usr 到 因此,我创建了一个变量 $path = "first\usr" 然后使用以下命令: sed -i -e 's!\\usr!${path}/g;' test.txt 但是,最终会出现以下情况: D:\firstSr 如何在sed中转义\u?假设正确分配了路径变量(分配中没有空格:路径='first\usr'),使用一个示例路径逐步修复输入文件test.txt: $ cat test.txt D:\usr 你原来的命令 $ se

我需要修改一些Windows路径

比如说,

D:\usr

因此,我创建了一个变量

$path = "first\usr"
然后使用以下命令:

sed -i -e 's!\\usr!${path}/g;' test.txt
但是,最终会出现以下情况:

D:\firstSr

如何在sed中转义
\u

假设正确分配了
路径
变量(分配中没有空格:
路径='first\usr'
),使用一个示例路径逐步修复输入文件
test.txt

$ cat test.txt
D:\usr
  • 你原来的命令

    $ sed 's!\\usr!${path}/g;' test.txt
    sed: -e expression #1, char 18: unterminated `s' command
    
    没有什么作用,因为您已经混合了
    /
    作为分隔符

  • 固定分隔符:

    $ sed 's!\\usr!${path}!g;' test.txt
    D:${path}
    
    现在,由于单引号,根本不会发生插值。我怀疑这些只是复制粘贴错误,因为您显然得到了一些输出

  • 双引号:

    $ sed "s!\\usr!${path}!g" test.txt
    bash: !\\usr!${path}!g: event not found
    
    现在,这与我们的观点相冲突。我们可以逃脱
    ,或使用其他分隔符

  • /
    作为分隔符:

    $ sed "s/\\usr/${path}/g" test.txt
    D:\firstSr
    
    现在我们是问题真正开始的地方
    ${path}
    扩展为
    first\usr
    ,但是
    \u
    在GNU中有一个特殊的含义,在替换字符串中使用:它将以下字符大写,因此是
    S

    即使没有特殊含义,
    \u
    也很可能只是扩展到
    u
    ,反斜杠也会消失

  • 避开反斜杠:

    $ path='first\\usr'
    $ sed "s/\\usr/${path}/g" test.txt
    D:\first\usr
    
    这很有效


  • 根据您使用的shell,您可以使用参数扩展在替换字符串中加倍
    \
    ,并防止
    \u
    解释:


    (注意,我在此筛选器中还引用了其他sed元字符)。

    可能的重复您还需要双重转义新值的内容,而不仅仅是sed搜索模式您使用的是什么shell或脚本语言
    $path=“first\usr”
    看起来像Perl,但其余的不像。。。
    $ path='first\\usr'
    $ sed "s/\\usr/${path}/g" test.txt
    D:\first\usr
    
    path="first\usr"
    sed -e "s/\\usr/${path//\\/\\\\}/g" <<< "D:\usr"
    
    path=$(echo "$path" | sed 's/[][\\*.%$]/\\&/g')