Board logo

标题: [文本处理] sed 4.3 单文件版 [打印本页]

作者: CrLf    时间: 2017-1-7 17:39     标题: sed 4.3 单文件版

GNU Sed发布了最新版4.3,号称正则表达式提速10倍,并优化了非阻塞IO性能。
已编译为win32单文件版,请前往 BatchCN 下载:

http://www.bathome.net/s/tool/?key=4.3/sed
作者: happy886rr    时间: 2017-1-7 19:19

回复 1# CrLf

大师sed,用什么编译,每次我用msys都编译不过去。编译参数是什么
作者: capslock    时间: 2017-1-7 23:59

我想起一件事, sed 维护者跑了
作者: CrLf    时间: 2017-1-8 00:09

本帖最后由 CrLf 于 2017-1-8 00:14 编辑

回复 2# happy886rr


msys 旧了,改用 msys2 吧,原生支持用 pacman 管理软件包

一开始我也编译不过去,知道发现 README-release 中提到用 ./bootstrap 检查依赖,才豁然开朗
参数没记下,应该是禁用了 nls 什么的才能去掉 iconv 依赖
作者: CrLf    时间: 2017-1-8 00:10

回复 3# capslock


    换人了,时隔四年终于有人接手
作者: CrLf    时间: 2017-1-8 17:39

本来嫌 gcc 自作主张把参数中的 *.txt 扩展成文件名导致由 --help.txt 引起的错误解析,所以去修改了一下 sed.c 。
不过改完后突然想到其实只要使用的时候都加上路径 .\*.txt 就可以避免,所以还是不把编译好的文件放上来了。
--------------------------------------------------------------------------------
记录一下修改步骤:
1、
在 main 之前加上:
  1. #include <windows.h>
  2. #include <dir.h>
  3. char * CommandLineToArgvA(char * Commandline,int * argc){
  4.     char *p,*q,*_Commandline[2048],**_argv;
  5.     int len,inQuo;
  6.     strcpy(_Commandline,Commandline);
  7.     _argv = (char*)malloc(1024*sizeof(char));
  8.     *argc=inQuo=0,q=p=_Commandline;
  9.     while(1){
  10.         if(!*p||(!inQuo&&(*p==' '||*p=='\t'))){
  11.             len=p-q;
  12.             _argv[*argc]=(char*)malloc((len+1)*sizeof(char));
  13.            if(*q=='"' && *(p-1)=='"'){
  14.                q++, len-=2;
  15.            }
  16.             memcpy(_argv[*argc],q,len);
  17.             _argv[(*argc)++][len]='\0';
  18.             for(++p;*p&&(*p==' '||*p=='\t');++p){}
  19.             q=p;
  20.         }
  21.         if(*p=='"')inQuo=!inQuo;
  22.         if(!*p++)break;
  23.     }
  24.     return _argv;
  25. }
  26. char * get_file_list(int * argv, int argc){
  27.     WIN32_FIND_DATA FileInfo;
  28.     int F_isDir; //标志判断
  29.     long Handle;
  30.     int i=0, len=0;
  31.     char lpPath[2048]="";
  32.     char *p;
  33.     char **_argv =(char*)malloc(8*1024*1024);
  34.     while(argc--){
  35.         strcpy(lpPath, *argv);
  36.         p = strrchr(lpPath,'\\')>strrchr(lpPath,'/') ? strrchr(lpPath,'\\') : strrchr(lpPath,'/') ;
  37.         if(p){
  38.             *(p+1) = '\0';
  39.         } else {
  40.             lpPath[0] = '\0';
  41.         }
  42.         if((Handle=FindFirstFile(*argv,&FileInfo))!=-1L){
  43.             while(1){
  44.                 if(!strcmp(FileInfo.cFileName,".")||!strcmp(FileInfo.cFileName,".."))goto NextFile;
  45.                 if(FileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)goto NextFile;
  46.                 len = strlen(FileInfo.cFileName);
  47.                 _argv[i]=(char*)malloc((len+1)*sizeof(char));
  48.                 strcpy(_argv[i],lpPath);
  49.                 strcat(_argv[i],FileInfo.cFileName);
  50.                 i++;
  51. NextFile:
  52.                 if(!FindNextFile(Handle,&FileInfo))break;
  53.             }
  54.         }
  55.         argv++;
  56.     }
  57.     return _argv;
  58. }
复制代码
--------------------------------------------------------------------------------
2、
在 main 的头部加上
  1.     int _argc_=0;
  2.     char **_argv_;
  3.     _argv_=CommandLineToArgvA(GetCommandLineA(),&_argc_);
  4.     argc = _argc_;
  5.     int nn =0;
  6.     for(nn=0; nn<argc; nn++){
  7.         strcpy(argv[nn],_argv_[nn]);
  8.     }
复制代码
--------------------------------------------------------------------------------
3、
再把
  1. return_code = process_files(the_program, argv+optind);
复制代码
改为:
  1. return_code = process_files(the_program, get_file_list(argv+optind, argc-optind));
复制代码

作者: yhcfsr    时间: 2018-8-31 15:00

亲测无问题
作者: liuzhaoyzz    时间: 2019-5-25 22:51

本帖最后由 liuzhaoyzz 于 2019-5-27 10:48 编辑

sed -i -e "/title\(.*\)/,+6d" c:\menu.lst
提示:cannot rename ./sedfkZ58z: Improper link
这是怎么回事?
作者: netdzb    时间: 2020-3-22 20:10

回复 8# liuzhaoyzz

这个是sed,gnu的bug不知道有人修复吗?




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2