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

替换线路起点时的奇怪sed行为

  •  1
  • JustAnotherSoul  · 技术社区  · 7 年前

    sed -e '{s/^/   /;s/\(a*\)/\1b/;}'
    

    因此,这基本上只是在行的开始处添加一些空格,然后用相同的东西替换任意数量的连续“a”,后跟一个b。

    预期:

    |Input    |Output
    |a        |   ab
    |aa       |   aab
    |aaa      |   aaab
    

    实际:

    |Input    |Output
    |a        |b   a
    |aa       |b   aa
    |aaa      |b   aaa
    

    我也试过了

    sed -e '{s/^/   /;s/\(a+\)/\1b/;}'
    

    1 回复  |  直到 7 年前
        1
  •  3
  •   hek2mgl    7 年前

    这个 * 方法 零或更多 . 自从 零或更多 a 可以是任何东西 b 将被放置在行的开头-这是最早的位置。

    + 不被理解 posix regular expressions ,由使用 sed


    您可以使用:

    sed -e 's/^/   /;s/\(a\{1,\}\)/\1b/;'
    

    \{1,\} 方法 并且是通用的,这意味着您也可以将其用于匹配组,例如:

    \(foo\)\{1,\}
    

    aa*
    

    (谢谢 melpomene 谢谢你提醒我)