【问题标题】:sed: replace multiple periods with another charactersed:用另一个字符替换多个句点
【发布时间】:2010-11-12 20:48:04
【问题描述】:

我正在 emacs org-mode 中从 .el 文件中制作一张日出命令命令的表格(想要制作一份备忘单)。列表如下所示:

/, 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              |
...

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

我无法让 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 的理解不够好,无法让它将句点视为句点(并针对其中的一团),而不是将它们视为通配符。第二个和第三个将每个句点视为一个句点,因为我以一堆垂直斜线结束。

但第一个似乎只是在每个字符之间放置了一个斜杠,所以我不确定它为什么会这样做。似乎它又回到了像通配符一样的行为。

感谢您的帮助。

【问题讨论】:

    标签: sed


    【解决方案1】:

    你需要逃离这个时期;句点匹配“任何字符”。此外,由于 sed 并不总是有 +(1 或更多)运算符,因此您需要明确指定 1 后跟 0 或更多,如下所示:

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

    并且,在重新阅读您的问题后,您需要在开头和结尾处使用管道。因此,也将 ^ 和 $ 替换为管道。您可以使用三个 -e 表达式来做到这一点,但我喜欢将这三个表达式都放在命令行中,用分号分隔。它有助于使图案看起来更像线噪声。 :)

    如果您想匹配 2 个或更多句点,请使用 \.\.\.*。等等。遗憾的是 sed 并不始终支持范围表达式。

    【讨论】:

    • 太棒了。这是第一次,效果很好。现在我考虑一下,语法是有道理的,尽管我的问题是认为 * 是“匹配 1 个或更多”,而不是 0 或更多,在这种情况下你是正确的:我需要一个句点后跟 0 个或多个句点。
    【解决方案2】:

    这应该为你做:

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

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

    希望它有效,它在 gnu sed 4.1.2 上有效。

    【讨论】:

    • 喜欢它的 {2,} 解决方案。那太棒了。没有碰巧有更多的时期,而是伟大的思想——仔细编码!不过,我不关注第二部分。对我来说,它大部分都有效,但在第一列中插入了很多选项卡,所以我的结果就像“|command \t\t\t\t|explanation|”。很难在评论框中输入!
    猜你喜欢
    • 2011-12-21
    • 2020-01-12
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2015-01-17
    • 2021-09-23
    相关资源
    最近更新 更多