我希望能够从代码中提取代码段以用于记录。每当我廉价编译代码时,都可以执行此操作,这是使代码和文档(至少是摘要)保持最新状态的简便方法。
因此,我想获取一个文件source.cc
,其中包含以下内容:
// DOCSNIP: source_def.snip
[code]
// DOCSNIP
显然,一个文件中可能有多个。要点是,我想界定一个代码区域(我不喜欢语法),以及要粘贴的文件名,并在定界符之间写入内容(在这种情况下为“ [code]”)到文件(source_def.snip)。
使用标准工具(awk / sed / grep)将这些块提取到各自文件的最简单方法是什么?
答案 0 :(得分:2)
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
仅打印中间的内容。
答案 1 :(得分:0)
使用AWK
awk '/\/\/ DOCSNIP:/{f=1;print $3;next} /\/\/ DOCSNIP/{f=0} f'
source_def.snip
[code]
这将从第一个DOCSNIP打印到第二个DOCSNIP,并输出文件名
答案 2 :(得分:0)
我喜欢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