代码之家  ›  专栏  ›  技术社区  ›  Geo

为什么SED需要3个反斜杠作为常规反斜杠?

  •  38
  • Geo  · 技术社区  · 15 年前

    我很好奇,为什么赛德需要3个 \ 只是为了认出一个?我知道需要2个,但我不需要3个。

    编辑:以下是我的Windows计算机上使用cygwin的示例:

    echo "sample_input\whatever" | sed "s/\\\/\//"
    

    如果我不加3个反斜杠,我得到一个

    sed: -e expression #1, char 7: unterminated s' command
    
    7 回复  |  直到 9 年前
        1
  •  39
  •   Dennis Williamson    15 年前

    我可以使用vista和cygwin 1.7.0重现这种行为。

    • 两个反斜杠产生错误
    • 任何一个 四个反斜杠
    • 五个给出相同的错误

    两个反斜杠变为shell中的一个反斜杠,然后在sed中,该反斜杠将转义中间分隔符正斜杠。

    \\/ -> \/ (which makes the forward slash a regular character instead of a delimiter)
    

    其中三个:前两个变成了壳中的一个,然后从塞德的第三个逃脱。

    \\\/ -> \\/
    

    四:每对在壳中变成一对,然后第一对在sed中逃逸第二对。

    \\\\/ -> \\/ 
    

    编辑:

    哦,我忘了说单引号和双引号对我来说都是一样的( cmd.exe 没有像Bash等人那样区分。

        2
  •  10
  •   Roger Pate    15 年前

    你的外壳(可能是bash)正在进行自己的逃跑,这让你很困惑。您可以使用echo命令查看正在传递的内容,或者很容易编写自定义程序(通常称为“showargs”或类似程序):

    $ echo "s/\\\/\//"
    s/\\/\//
    $ echo "s/\\/\//"
    s/\/\//
    

    您还可以使用单引号,这在bash中被区别对待。

        3
  •  6
  •   MS.Kim    11 年前

    这是由于 sh 的双引号字符串分析规则。

    Posix 指定如何 分析双引号字符串。

    反斜杠应保留其作为转义符的特殊含义(见转义符(反斜杠)),仅当以下字符之一被视为特殊字符时: 美元\

    换言之, 左键是反斜杠,后跟除“$”之外的字符。

    所以,如果 满足双引号字符串 sed "s/\\\/\//" , 分析如下。

    1. 前两个 \\ 变为 \ . 因为第一个 \ 后面跟着第二个 \ .
    2. 第三和第四 \ 仍留在字符串中。因为他们两个后面都有 / ,这在双引号字符串中并不特殊。

    打趣之后, 传递字符串 s/\\/\// sed 它替代了 \ 进入之内 / .

    用同样的理由,当 遇到了绳子, "sed s/\\\\/\//" , 传球 /\\/\// 塞德 这也替代了 \ 进入之内 / .

        4
  •  4
  •   ghostdog74    15 年前

    请举一个你未来拥有的例子。在sed中,假设您要替换a“ \ “例如,使用管道()

    $ cat file
    asklfja \ asf
    
    $ sed 's/\\/|/g' file
    asklfja | asf
    
    $ sed 's%\\%|%g' file #using different delimiter
    asklfja | asf
    

    你只需要逃避一次。

    编辑:以@op为例,由于您使用的是cmd.exe而不是bash/ksh,因此cmd.exe不喜欢单引号。我不能提出你的方案。这适用于我在Windows上使用2个斜杠的GNU SED

    C:\test>echo "sample_input\whatever" | sed "s/\\/\//"
    "sample_input/whatever"
    
        5
  •  1
  •   James K    14 年前

    在我的Cygwin版本中,它的工作方式和最初的海报上说的一样,但是,如果我使用单引号,它的工作方式(通常)会有所不同。

    $ echo "sample_input\whatever" | sed 's/\\/\//'
    sample_input/whatever
    
    $ echo "sample_input\whatever" | sed "s/\\/\//"
    sed: -e expression #1, char 7: unterminated `s' command
    

    六羟甲基三聚氰胺六甲醚。。

        6
  •  0
  •   YOU    15 年前

    我想,你假设 \\\n \\\t 这里有三个反斜杠,但实际上有两个反斜杠和另一个图案

       backslash          \\
       newline            \n
       tab                \t
    

    也, / 可能需要逃跑,因为 s/.../ , / 用于打开和关闭部件。

    所以 /\\\/\// 将是 \\ + \/ + \/ 根据您更新的示例

        7
  •  0
  •   OutputLogic    12 年前

    在cygwin上用两个反斜杠替换一个反斜杠需要以下表达式:

    SED-E“S \ \ \ \ \ \ \ \ \ \ G”