本帖最后由 CrLf 于 2016-1-3 19:25 编辑
单文件无 .dll 依赖
支持 PCRE 正则(-P 开关)
支持 win 下的回车换行
已更新到 Batch-CN
下载地址:http://www.bathome.net/s/tool/?d ... Fgrep&keymode=3
该版本和其他版本见列表:http://www.bathome.net/s/tool/?key=grep&keymode=3
20151223 通过重定义 fwrite 的方式实现支持 \r\n 格式的换行,效率可能比原版略有降低,也未考虑超大 size 的情况
20160103 重定义 fputs/puts/fputc,使其支持 \r\n 格式的换行
实现代码: | size_t _fwrite_CrLf(const void* buffer, size_t size, size_t count, FILE* stream) | | { | | size_t ret=0; | | size_t sc,pc; | | char *p,*pbuffer,*q=buffer,lastC='\0'; | | pc=sc=size*count; | | p=pbuffer=malloc(sc*2); | | for(;sc-->0;p++,q++){ | | if(*q=='\n'&&lastC!='\r'){ | | *p='\r'; | | p++,pc++; | | } | | lastC=*p=*q; | | } | | *p='\0'; | | ret=fwrite(pbuffer, 1, pc, stream); | | free(pbuffer); | | return ret; | | } | | | | | | int _fputs_CrLf(const void* buffer, FILE* stream) | | { | | size_t count, ret; | | count = strlen(buffer); | | ret = _fwrite_CrLf(buffer, 1, count, stream); | | if(ret != count) return ret; | | | | fputc('\r', stream); | | fputc('\n', stream); | | return ret+2; | | } | | | | | | int _fputc_CrLf(const char chr, FILE* stream) | | { | | if(chr=='\n') | | return fwrite("\r\n", 1, 2, stream) == 2 ? chr : -1; | | else | | return fputc(chr, stream); | | } | | | | | | #undef fwrite | | #define fwrite(buffer, size, count, stream) _fwrite_CrLf(buffer, size, count, stream) | | | | #undef fputs | | #define fputs(buffer, stream) _fputs_CrLf(buffer, stream) | | | | #undef puts | | #define puts(buffer) _fputs_CrLf(buffer, stdout) | | | | #undef fputc | | #define fputc(chr, stream) _fputc_CrLf(chr, stream)COPY |
|