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

标签 sed

我正在 .el 文件中以 emacs org-mode ofsunrise-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 的理解不够好,无法将句点视为句号(并针对其中的一团)而不是将它们视为通配符。第二个和第三个将每个时期视为一个时期,因为我最终得到了一堆垂直斜线。

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

谢谢你的帮助。

最佳答案

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

sauer@trogdor:~$ echo 'h...ello world' | sed 's/^/|/;s/\.\.*/|/;s/$/|/'
|h|ello world|
并且,在重新阅读您的问题后,您希望在开头和结尾都有一个管道。因此,也用管道替换 ^ 和 $。你可以用三个 -e 表达式来做到这一点,但我喜欢把这三个都放在命令行中,用分号隔开。它有助于使图案看起来更像线噪声。 :)
如果你想匹配 2 个或更多句点,使用 \.\.\.* .等等。令人遗憾的是 sed 并不始终支持范围表达式。

关于sed:用另一个字符替换多个句点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4168924/

相关文章:

bash - 替换除字母以外的所有内容

linux - 我怎样才能找到包含多个模式的文件

linux - 查找比特定列长/短的记录

regex - 如何使用 sed 只删除双空行?

bash - 如何使用 sed 找到一个模式,然后找到第二个模式,然后仅在第二个模式之后附加文本?

linux - Sed 语句不工作 Linux Raspbian

regex - sed 在两个字符串之间替换通配符

sed - 使用 sed 将一行的末尾附加到下一行的开头

linux - 如何从Linux中的字符串中提取以用户定义的特殊字符开头和结尾的子字符串?

python - 将具有多个表达式的 sed 转换为 python