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

Hen*_*ndy 7 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
...
Run Code Online (Sandbox Code Playgroud)

我想用这种格式将它变成一个组织模式表:

| /, 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              |
...
Run Code Online (Sandbox Code Playgroud)

Org会照顾间距; 我只需要"|命令|解释|"

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

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
Run Code Online (Sandbox Code Playgroud)

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

sed -e 's/^[ \t]*/|/g;s/[ \t]*$/|/g'|
Run Code Online (Sandbox Code Playgroud)

现在我只需要为一系列时期做同样的事情.我害怕我不理解sed足以让它像处理一段时期(并且针对它们的一小部分)而不是将它们视为通配符.第二个和第三个对待每个时期就像一个时期,因为我最终得到一堆垂直斜线.

但是第一个似乎只是在每个角色之间加上一个斜线斜杠,所以我不确定它为什么这样做.似乎它回归到像通配符这样的行为.

谢谢你的帮助.

dan*_*uer 5

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

sauer@trogdor:~$ echo 'h...ello world' | sed 's/^/|/;s/\.\.*/|/;s/$/|/'
|h|ello world|
Run Code Online (Sandbox Code Playgroud)

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

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