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

时间:2010-11-12 20:48:04

标签: sed

我正在使用.el文件中的sunrise-commander命令的emacs组织模式创建一个表(想要制作一个备忘单)。该列表如下所示:

/, 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会照顾间距;我只需要“| command | explanation |”

我无法使用垂直斜线替换多个句点。我目前的尝试是这样的:

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足以让它像处理一段时期(并针对它们的一小部分)而不是将它们视为通配符。第二个和第三个对待每个时期就像一个时期,因为我最终得到了一堆垂直斜线。

但是第一个看起来似乎在每个角色之间放了一个斜线斜杠,所以我不确定它为什么这样做。看起来好像它会像通配符那样表现。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

你需要逃避这个时期;期间匹配“任何角色”。并且,由于sed并不总是具有+(1或更多)运算符,因此您希望使用一个后跟0或更多运算符,如

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

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

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

答案 1 :(得分:4)

这应该适合你:

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

{2,}只是说要匹配2个或更多,所以如果你遇到其他地方的句号,你就不会有问题。 '-e'表示多个正则表达式,'-r'表示使用扩展正则表达式。

希望它有效,它确实在gnu sed 4.1.2。