【问题标题】:Escape character confusing in sed commandsed 命令中的转义字符混淆
【发布时间】:2014-08-01 03:42:10
【问题描述】:

sed 有一个常见的用法是 escape 。 sed 's/\\\. / \\\\\\\\./g'
我很困惑为什么这么多\

【问题讨论】:

  • 如果我想实现这个功能,我认为我会使用sed 's/\./\\./g'
  • 您建议的替代方案与原始匹配的模式不匹配,更不用说用相同的替换材料替换匹配项了。
  • 这取决于预期的结果。例如,我经常使用这种 sed 操作来分配一个变量内容,该内容稍后将用作正则表达式中的模式或回显(当 printf 不是使用 var 的唯一指令时)...

标签: shell sed escaping


【解决方案1】:

/\\\. /

搜索模式 \.

默认情况下\是转义字符后的序列,点表示“任何字符”,所以\。通过转义斜杠 (\\) 后跟转义点 (\.)

以正则表达式格式翻译

/ \\\\\\\\./

替换为 \\. 有 8 个斜线和 1 个点。 4 转义斜线的原因与之前的研究模式相同,但在替换模式中点表示点,因此无需转义。

另一种写法 /[\][.]/\\\\\\&/ 或为了好玩 /\([\]\)[.]/\1\1\1&/ 采取

【讨论】:

  • \\\\\\&/ & 含义?
  • & 在替换模式中的意思是“找到所有搜索模式内容”,所以这里是 \。 (斜线后跟点)
【解决方案2】:

没有明显的理由为什么这对模式是可取的,但它所做的就是寻找一个反斜杠、一个点和一个空格,并将该序列替换为一个空格、四个反斜杠和一个点;所有这些都是针对原始输入中的每个反斜杠、点、空格序列完成的。

替换命令是:

s/\\\. / \\\\\\\\./

在替换命令的第一部分,匹配部分:

  • 你有一对反斜杠;这些匹配单个反斜杠。
  • 您有一个反斜杠点对;它们匹配单个点(通常,点匹配任何字符,因此反斜杠会暂停点的特殊元字符含义)。
  • 你有一个空间。

在替换命令的第二部分,替换部分:

  • 你有一个空间。
  • 您有四对反斜杠,每对都在替换中放置一个反斜杠。
  • 你有一个点。

但除了测试您在sed 中编写正则表达式的能力之外,没有明显的理由表明这是一个合适的替换。

请注意,由于sed 脚本表达式位于单引号内,因此shell 不会对字符串的内容进行任何解释。如果它用双引号括起来,那么 shell 将处理参数,并在 sed 看到表达式之前删除五个反斜杠,从而导致对发生的事情有不同的解释。这是尽可能在正则表达式周围使用单引号的绝佳理由。

【讨论】:

    【解决方案3】:

    解码转义序列的最简单方法是将它们分成对(一个斜线,另一个是与之相连的字符。)然后您可以简单地单独评估这些对。但是\\ 用于表示输出中的单斜杠。

    一些例子是:

    a \ - Append
    i \ - Insert
    s/..../..../ - Substitute
    
    
    Sed Pattern Flags
    /g - Global
    /I - Ignore Case
    /p - Print
    /w filename - Write Filename
    

    更多参考视图: http://www.grymoire.com/unix/sed.html

    【讨论】:

    • ???示例与问题无关,// 不是转义斜杠 '\\' 是转义斜杠(不带引号)
    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    相关资源
    最近更新 更多