代码之家  ›  专栏  ›  技术社区  ›  Neal.Marlin

为什么转义字符和正则表达式不能很好地与sed命令配合使用?

  •  0
  • Neal.Marlin  · 技术社区  · 7 年前

    [heping@Laputa:~]$echo "abc  def    gks       dps" | sed "s/\s+/\n/g"
    abc  def    gks       dps
    [heping@Laputa:~]$echo "abc  def    gks       dps" | sed "s/\s\{1,\}/\n/g"
    abc  def    gkn       dpn
    [heping@Laputa:~]$echo "abc  def    gks       dps" | sed "s/ \{1,\}/\n/g"
    abcndefngksndps
    [heping@Laputa:~]$echo "abc  def    gks       dps" | sed "s/ \{1,\}/:/g"
    abc:def:gks:dps
    [heping@Laputa:~]$echo "abc  def    gks       dps" | sed "s/ +/:/g"
    abc  def    gks       dps
    

    但实际上,只有一个有效。

    [heping@Laputa:~]$echo "abc  def    gks       dps" | sed "s/ \{1,\}/:/g"
        abc:def:gks:dps
    

    看来 \s + \n 未被识别为新行。谁能告诉我为什么或者给我一些线索吗。非常感谢。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Ed Morton    7 年前

    sed匹配基本正则表达式,而元字符 + 来自扩展正则表达式。速记 \s 对于POSIX字符类 [[:space:]] \n " )而不是单引号( '

    在任何POSIX sed中执行您想要的操作是:

    $ echo 'abc  def    gks       dps' | sed 's/[[:space:]][[:space:]]*/\
    /g'
    abc
    def
    gks
    dps
    

    但这将与gnused一起工作(注意 -E 为启用ERE -这在GNU-sed和OSX/BSD-sed中是受支持的,但是在这两个sed中只有GNU-sed支持 \s码 \不 ):

    $ echo 'abc  def    gks       dps' | sed -E 's/\s+/\n/g'
    abc
    def
    gks
    dps
    
        2
  •  2
  •   Amadan    7 年前

    有几个问题。首先, sed 默认情况下使用基本正则表达式,而这些表达式不识别 + . 使用 -E

    其次, 塞德 \n ; 但你可以用 ANSI C quoting 使 bash ,你会在你的房间里有个断线 模式,所以你必须避开线中断,使 塞德 \\ 为了逃走 \不 换行符,总共三个反斜杠。

    \s 作为一个字符类也不承认香草 塞德 塞德 Linux发行版使用的)。如果需要与OSX(或 brew install gnu-sed ).

    echo "abc  def    gks       dps" | sed -E $'s/ +/\\\n/g'
    # => abc
    #    def
    #    gks
    #    dps