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

sed:用另一个字符替换多个句点

sed
  •  7
  • Hendy  · 技术社区  · 15 年前

    我正在用emacs org模式从.el文件中生成sunrise commander命令的一个表(想制作一个备忘单)。列表如下:

    /, j .......... go to directory
    p, n .......... move cursor up/down
    M-p, M-n ...... move cursor up/down in passive pane
    ^, J .......... go to parent directory
    ...
    

    我想把它做成一个组织模式表,格式如下:

    | /, j     | go to directory                     |
    | p, n     | move cursor up/down                 |
    | M-p, M-n | move cursor up/down in passive pane |
    | ^, J     | go to parent directory              |
    ...
    

    Org会处理间距;我只需要“|命令|解释|”

    我不能让sed用垂直斜线替换多个句点。我目前的尝试是这样的:

    cat in.org | sed -e 's/[.]*/|/g' > out.org
    cat in.org | sed -e 's/[.]/|/g' > out.org
    cat in.org | sed -e 's/[.*]/|/g' > out.org
    

    我已经用它将前导空格和尾随空格替换为垂直斜杠:

    sed -e 's/^[ \t]*/|/g;s/[ \t]*$/|/g'|
    

    现在我只需要对一系列的句号做同样的操作。恐怕我对sed的理解不够好,不能让它把周期当作一个周期(并针对其中的一个blob),而不是把它们当作通配符。第二个和第三个将每个句点都看作一个句点,因为我最后得到了一堆垂直斜杠。

    但第一个似乎只是在每个字符之间放了一个垂直斜杠,所以我不知道为什么它会这样做。好像又回到了通配符的角色。

    谢谢你的帮助。

    2 回复  |  直到 15 年前
        1
  •  4
  •   dannysauer    15 年前

    您需要对句点进行转义;句点与“任何字符”匹配。而且,由于sed并不总是有一个+(1或更多)运算符,因此您希望使用一个后跟0或更多的运算符,如

    sauer@trogdor:~$ echo 'h...ello world' | sed 's/^/|/;s/\.\.*/|/;s/$/|/'
    |h|ello world|
    

    在重读了你的问题之后,你希望在开头和结尾都有一根管子。所以,把^和$也换成一根管子。您可以使用三个-e表达式来实现这一点,但我喜欢将这三个表达式都放在命令行中,并用分号分隔。它有助于使图案看起来更像线噪声。:)

    如果要匹配两个或多个句点,请使用 \.\.\.* . 很遗憾sed不总是支持范围表达式。

        2
  •  4
  •   Seamus Connor    15 年前

    这应该对你有用:

    sed -r -e 's/\.{2,}/|/' -e 's/(.*)/|\1|/'
    

    这个 {2,} 只要说匹配2个或更多,这样如果你在其他地方遇到经期,你就不会有问题。“-e”处理多个正则表达式,“-r”表示使用扩展正则表达式。

    希望它能起作用,它在gnu sed 4.1.2上起作用。

    推荐文章