Я хотел бы иметь возможность извлекать фрагменты из моего кода для документирования. Я могу делать это каждый раз, когда я дешево компилирую код, и это простой способ поддерживать код и документацию (по крайней мере, фрагменты) в актуальном состоянии.

Поэтому я хотел бы взять файл source.cc с чем-то вроде этого:

// DOCSNIP: source_def.snip
[code]
// DOCSNIP

Очевидно, что в файле может быть несколько таких файлов. Суть в том, что я хотел бы разделить область кода (я не женат на синтаксисе) вместе с именем файла, в котором он должен быть вставлен, и записать содержимое между разделителями (в данном случае «[code]») в файл (source_def.snip).

Как проще всего стандартными инструментами (awk / sed / grep) извлечь эти блоки в соответствующие файлы?

1
gct 20 Авг 2018 в 20:15

3 ответа

Лучший ответ

awk спешит на помощь!

$ awk '/\/\/ DOCSNIP:/{f=$NF} f{print > f} /\/\/ DOCSNIP$/{f=""}' file

$ head sou*

// DOCSNIP: source_def.snip
[code]
// DOCSNIP

Не будет работать, если у вас есть пробелы в именах файлов.

Если вы не хотите разделять строки, просто измените порядок операторов

$ awk '/\/\/ DOCSNIP$/{f=""} f{print > f} /\/\/ DOCSNIP:/{f=$NF}' file

Будет печатать только то, что между ними.

2
karakfa 20 Авг 2018 в 17:52

Использование AWK

awk '/\/\/ DOCSNIP:/{f=1;print $3;next} /\/\/ DOCSNIP/{f=0} f'
source_def.snip
[code]

Это печатает от первого DOCSNIP до второго DOCSNIP, а также выводит имя файла

0
Jotne 20 Авг 2018 в 17:55

Мне нравится Perl, потому что его не существует. Тем не менее, я думаю, что я предпочитаю awk для этого. Тем не менее, версия Perl (та же основная идея, что и принятый ответ):

perl -ne 'BEGIN{my $fh} {close $fh if /\/\/ DOCSNIP[^:]/; print { $fh } "$_" if $fh!=0; open ($fh, ">>", "$1") or die if /\/\/ DOCSNIP:\s*(.+?)$/; }' main.cc

Это поддерживает пробелы в именах файлов, что я не думаю, что это функция, которая вам нужна :)

И подготовка, которая удаляет снипп-файлы и дает ожидаемый результат:

 perl -ne 'print if /\/\/ DOCSNIP:/../\/\/ DOCSNIP[^:]/; unlink "$1" if /\/\/ DOCSNIP:\s*(.+?)$/' main.cc
0
zzxyz 20 Авг 2018 в 18:46
51935622