sed: заменить несколько периодов другим символом - PullRequest
7 голосов
/ 12 ноября 2010

Я создаю таблицу в emacs org-mode команд sunrise-commander из файла .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
...

Я хочу превратить это в таблицу в режиме org в следующем формате:

| /, 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, чтобы заставить его трактовать периоды как период (и нацеливать их на большое число), а не рассматривать их как символы подстановки. Второй и третий трактуют каждый период как период, так как я получаю кучу вертикальных слешей.

Но первый, кажется, ставит черту между каждым отдельным персонажем, так что я не уверен, почему он это делает. Кажется, он снова начинает вести себя как подстановочный персонаж.

Спасибо за любую помощь.

Ответы [ 2 ]

4 голосов
/ 13 ноября 2010

Это должно сделать это для вас:

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

{2,} просто говорит, что соответствует 2 или более, так что если вы столкнетесь с периодами в других местах, у вас не будет проблемы.'-E' выполняет несколько регулярных выражений, а '-r' означает использование расширенных регулярных выражений.

Надеюсь, что это работает, это работает в GNU SED 4.1.2.

4 голосов
/ 13 ноября 2010

Вам нужно уйти от периода; Период соответствует «любому символу». И, поскольку sed не всегда имеет оператор + (1 или более), вы хотите использовать оператор, за которым следует 0 или более, как в

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

И, перечитав свой вопрос, вы хотите трубу в начале и в конце. Итак, замените ^ и $ на трубу. Вы можете сделать это с помощью трех выражений -e, но мне нравится просто помещать все три в командной строке через точку с запятой. Это помогает сделать рисунок более похожим на шум линий. :)

Если вы хотите сопоставить, скажем, 2 или более периодов, используйте \.\.\.*. И т.д. Жаль, что sed не всегда поддерживает выражения диапазона.

...