本帖最后由 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)
复制代码
|