因此,我作为程序员的一项常见任务是调试实时系统。我调试实时系统的方法之一是从控制台捕获详细日志。
通常,对于我感兴趣的每一行,日志文件都有大约 20 行额外的行。
为了最小化我的宏脚本,我开始创建一个宏,它只会抓取 20 行中我感兴趣的一行!(而不是对我不想要的所有行进行 20 次替换......这会使宏比它需要的长 20 倍。)这个宏代码的其余部分会将这一行变成 *.csv文件,这样我就可以在我认为合适的时候使用 Matlab 或 Excel 中的数字。
这是宏的代码(这些命令是 Ultra Edit 特定的命令):
Clipboard 1
ClearClipboard
Loop
Find RegExp "{*}DBGLINE: STR1 ( * ) STR2 ( * )^p"
IfFound
CopyAppend
Else
ExitLoop
EndIf
EndLoop
SelectAll
Delete
Paste
Find RegExp "{*}DBGLINE: STR1( "
Replace All ""
Find RegExp " ) STR2 ( "
Replace All " , "
Find RegExp " )*^p"
Replace All "^p"
ClearClipboard
*仅供参考,我已经发布了每个命令在线执行的 API/描述。
让我用一个更易读的伪代码来分解这个宏在做什么:
buffer = "";
// Keep finding $REGEX until EOF
while(1) {
if( Find $REGEX ) {
Select the text;
} else {
break;
}
buffer += selected piece of text;
}
// Now we can focus only on the selected lines from the log file
Select the entire text in the file;
Delete all selected text;
Paste the buffer into the text file;
// Convert the human readable text into a *.csv file
Parse out all the non-numerical content;
Replace with " , " commas;
我知道如何通过在我的 .vimrc 文件中添加映射来在 VIM 中创建简单的宏:
map $KEYBOARD :%s/$STR_A/$STR_B/gc<CR>
但我想知道是否有某种方法可以在宏中执行 while(1) 和 CopyAppend。就像在某种 .vimrc 定义的函数中一样:
function! CustomScript1()
...
" TODO: vim commands here
...
endfunction
map $KEYBOARD :call CustomScrip1()<CR>
那么如何将上面的 UltraEdit 宏改成 VIM 函数呢?
我真的需要能够在 VIM 中重新创建这种脚本,因为我目前被困在做 20 个替代品(有时更多)和替换......这让我发疯了,浪费我的时间做这种不雅的解决方案来解析日志文件!