无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 2213|回复: 2
打印 上一主题 下一主题

如何利用 仿linux命令 sed 一次替换文字中的 "某些相似性的字串"

[复制链接]
跳转到指定楼层
1#
发表于 2015-2-15 04:53:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wang_966 于 2015-2-16 08:15 编辑

如何利用 仿unix/linux命令 sed 一次替换文字中的 "某些相似性的字串"

* 如果在 windows 下可下载 "仿unix/linux命令", 其中也有 sed.exe 可用
* 在 unix/linux 大多数复杂的批次处理都可以不用设计程式来达成
* 如果在 unux/linux 可以用 sed 命令来编辑大量的文字档

* windows下安装 UnxUtils -- 仿 unix/linux 命令 (约120个) ==>
   http://bbs.wuyou.net/forum.php?mod=viewthread&tid=362519

________________________________________________________
以下范例乃本人为网友的解答:

* 范例1:将 小说.txt 分割成3等份左右:
REM 将 小说.txt 分割成3等份左右,  split3.bat 内容如下 :
REM 利用 仿unix命令 :
REM 1.计算行数用法 wc.exe --help
REM 2.改字串用法 sed.exe --help
REM 3.计算用法 expr.exe --help
REM 4.分割用法 split.exe --help

REM 计算 expr 行数 / 3  的值, 存到 tmp.txt
echo @echo off > tmp.bat
wc -l 小说.txt  | sed -e "s: *\([0-9][0-9]*\).*:expr \1 / 3:" >> tmp.bat
call tmp.bat > tmp.txt

REM 些生 split.exe -行数 input.txt  output_
sed -e "s:\(.*\):split.exe -\1 小说.txt  output_:" < tmp.txt >  tmp.bat

call tmp.bat

move output_aa   小说_1.txt
move output_ab   小说_2.txt
move output_ac   小说_3.txt
del tmp.txt
del tmp.bat

* 注解:
sed.exe -e "编辑指令" < 输入档 > 输出档
编辑指令中有 "s/找字串一/改成字串二/" 或 "s:找字串一:改成字串二:" ,
其中 s 表示 "替代"
找字串一 http.*\/\([0-9][0-9]*\)\.[jJ][pP][gG] , 其中
  .  表示 "任意字",  *  表示 "前面的字出现任意次数", 因此
  .*  表示 "任意字出现任意次数"
\ 表示 将其后的字的意义 "取消 或 另做不同的解释" , \/ 表示 / ,
\([0-9][0-9]*\) 表示将 \(  \) 的内容存到字串二的 \1 中 ,
[0-9]  表示一个字为范围介于0-9之间的数字,
[0-9]* 表示数字重复出现任意次(含零次) ,
\. 表示一个字 .
[jJ] 表示一个字内容为 j 或 J




* 范例2:假设有一个档案 c:\input.txt 内容如下:
<a href=http://hgdyv.bay.livefilestore.com/mdfkjfbvfjgnkkk485tu89-gnfsji83-gjde_/1.jpg>
<a href="http://hgdyv.bay.livefilestore.com/123gnkkk485tu89-gnfsji83-gjde_/52.jpG">
<a href="http://www.abcdef.com/d3nj6-_R/903.JPg">

  要将存放的网址全部替换, 最后产生 c:\output.txt 内容如下:
<a href="http://www.name.com/1.JPG">
<a href="http://www.name.com/52.JPG">
<a href="http://www.name.com/903.JPG">


则利用以下命令便可编辑出所要的结果:

sed.exe -e "s/http.*\/\([0-9][0-9]*\)\.[jJ][pP][gG]/http:\/\/www.name.com\/\1.JPG/" < c:\input.txt > c:\output.txt

执行完便产生 c:\output.txt 内容为:
<a href=http://www.name.com/1.JPG>
<a href="http://www.name.com/52.JPG">
<a href="http://www.name.com/903.JPG">

* 注解:
sed.exe -e "编辑指令" < 输入档 > 输出档
编辑指令中有 "s/找字串一/改成字串二/" 或 "s:找字串一:改成字串二:" ,
其中 s 表示 "替代"
找字串一 http.*\/\([0-9][0-9]*\)\.[jJ][pP][gG] , 其中
  .  表示 "任意字",  *  表示 "前面的字出现任意次数", 因此
  .*  表示 "任意字出现任意次数"
\ 表示 将其后的字的意义 "取消 或 另做不同的解释" , \/ 表示 / ,
\([0-9][0-9]*\) 表示将 \(  \) 的内容存到字串二的 \1 中 ,
[0-9]  表示一个字为范围介于0-9之间的数字,
[0-9]* 表示数字重复出现任意次(含零次) ,
\. 表示一个字 .
[jJ] 表示一个字内容为 j 或 J


.......................................................................................

* 范例3:假设有一个档案 c:\input.txt 内容如下:
abcd:001:a2222:efgh:wert:99
xxyyzz:0002:b333:ccddee:pppp:756

  每行有数个栏位以 : 隔开,要将每行的第2栏与第3栏位置互换,最后产生 c:\output.txt 内容如下:
abcd:a2222:001:efgh:wert:99
xxyyzz:b333:0002:ccddee:pppp:756


则利用以下命令便可编辑出所要的结果:

sed.exe -e "s/\([ -9;-~][ -9;-~]*\):\([ -9;-~][ -9;-~]*\):\( -9;-~][ -9;-~]*\):\(.*\)/\1:\3:\2:\4/" < c:\input.txt > c:\output.txt

* 注解:
sed.exe -e "编辑指令" < 输入档 > 输出档
编辑指令中有 "s/找字串一/改成字串二/" , 其中 s 表示 "替代"
   其中  [ -9;-~]  表示 " : 以外的任意字",
    *  表示 "前面的字出现任意次数", 因此
    [ -9;-~]*  表示 "除了 : 外任意字出现任意次数" ,
    字串一之中的第1组 \(  \) 的内容存到字串二的 \1 中 ,
    字串一之中的第2组 \(  \) 的内容存到字串二的 \2 中 ,
    字串一之中的第3组 \(  \) 的内容存到字串二的 \3 中 ,
    字串一之中的第4组 \(  \) 的内容存到字串二的 \4 中 .
.......................................................................................

* 范例4:假设有一个档案 c:\input.txt 内容如下:
abcd:001:2222:efgh:wert
xxyyzz:0002:333:ccddee:pppp

  每行有数个栏位以 : 隔开,将每行的第2栏位相加显示总和在萤幕.


则利用以下命令(echo, sed, dc )便可得出所要的结果:

echo 0 > c:\output.txt
sed.exe -e "s/[ -9;-~][ -9;-~]*:\([ -9;-~][ -9;-~]*\):.*/\1+/" < c:\input.txt >> c:\output.txt
echo p >> c:\output.txt
dc.exe < c:\output.txt

* 注解:
echo 0 > c:\output.txt 表示存一个字 "0" 到 c:\output.txt
sed.exe -e "编辑指令" < 输入档 >> 输出档(不清除旧档直接并入)
编辑指令中有 "s/找字串一/改成字串二/" , 其中 s 表示 "替代"
   其中  [ -9;-~]  表示 " : 以外的任意字",
    *  表示 "前面的字出现任意次数", 因此
    [ -9;-~]*  表示 "除了 : 外任意字出现任意次数" ,
    字串一之中的第1组 \(  \) 的内容存到字串二的 \1 中 ,
echo p >> c:\output.txt 表示存一个字 "p" 到 c:\output.txt文末.
   因此 c:\output.txt 的 内容如下:
0
001+
0002+
p

dc < c:\output.txt  会将 0 001 0002 相加 再 print 加总结果 3 到萤幕
dc 为后置式桌上计算器, 请参考 ==>
   
    dc.c (仿unix命令dc, 后置式计算机, 请参考第一个回复的C程式) ------ Mike Wang


.......................................................................................

* 范例5:如何把input.txt文件内容以列倒排(但每列文字不变):

  利用以下命令(sed , sort)便可得出所要的结果:

sed.exe -e "s/^/0/" < c:\input.txt | sort.exe  -r  -k  1,1 | sed.exe -e "s/0//" > c:\output.bat

* 注解: 利用sed在每列开头加一个字, 例如 "0", 再用sort反向排序, 最后将每列的第一个字删除.
  
编辑指令 sed.exe -e  "s/找字串一/改成字串二/" , 其中 s 表示 "替代"
其中
  ^  表示 "每列的开头",  不占字数.

排序指令 sort.exe
     -r 表示反向排序
     -k  1,1 表示只比较第1个字
欲了解sort.exe的用法请打:
sort  --help


.......................................................................................

* 范例6:假设有一个档案 c:\input.txt 内容如下:
1234567890abcd
xxyyzz:0002:333:ccddee:pppp

  取出第1列的前3个字, 并检查是否为 "123" :

则利用以下命令(sed , expr)便可得出所要的结果:

sed.exe -e "2,$d" -e "s/\(...\).*/expr 123 = \1/" < c:\input.txt > c:\check123.bat

* 注解:
编辑指令 -e "2,$d" 表示删除第2列至最后列.
编辑指令 -e  "s/找字串一/改成字串二/" , 其中 s 表示 "替代"
其中
  .  表示 "任意字",  *  表示 "前面的字出现任意次数", 因此
  .*  表示 "任意字出现任意次数"
   字串一之中的第1组 \(  \) 的内容存到字串二的 \1 中 ,
  因此 c:\check123.bat 的 内容如下:
expr 123 = 123
执行check123.bat 若相等的return值为 1 ; 若不相等则return值为 0





_________________________________________________________________
* 请立设 "虚拟磁碟" 狂奔! Firefox 36 免安装 异境版 Flash Player+13元件
                                    (PE/Win, 自动侦测 简/繁/英 一版通用) ==>

   http://bbs.wuyou.net/forum.php?mod=viewthread&tid=362183

* 12682 台股1990年高点与 "(宇宙密码)费氏系数及黄金切割率的数学关系式" ==>
   http://bbs.wuyou.net/forum.php?mod=viewthread&tid=362540

* 心算星期几 -- 王氏口诀 ==>
   http://bbs.wuyou.net/forum.php?mod=viewthread&tid=362185

本文出自: http://blog.xuite.net/tools241
2#
 楼主| 发表于 2015-2-15 05:10:56 | 只看该作者
/*
程式档名 : dc.c         (仿unix命令dc, 后置式计算机)
功能说明 : desk caculator
initial coding by Mike Wang
设 计 者 :  (笔名)王骏(Mike Wang)
blog      : http://blog.xuite.net/tools241
免费参考: This library is free software.

Example1:Type '2 3* 4 5* +p' for computing '(2*3)+(4*5)'

注: unix命令 "dc" 的功能可以计算出 100! (=100*99*98*...*3*2*1),

       有兴趣者可以设计看看.

*/


#include
#include
double cdecl sqrt(double);
#define MAXSTACK 200
int stack;
main()
{
char c;
int nflag, i;
long num, nn[MAXSTACK+1], z[26];
/*msg();*/
for(i=0;i<26;i++) z = 0L;
stack = 0;
num = 0L;
nflag = 0;
while(c=getchar()) {
  if(c>='0' && c<='9') {
   num = num * 10L + (long)(c - '0');
   nflag = 1;
   continue;
  }
  else switch(nflag) {
    case 1:
     if(!overflow())
      nn[++stack] = num;
     num = 0L;
     break;
    case 2:
     if(c>='a'&&c<='z'&&stack>=0) {
      z[c-'a'] = nn[stack];
      stack--;
      nflag = 0;
      continue;
     }
     break;
    case 3:
     if(c>='a'&&c<='z') {
      if(!overflow())
       nn[++stack] = z[c-'a'];
      nflag = 0;
      continue;
     }
     break;
   }
  nflag = 0;

  switch(c) {
  case '+':
   if(stack > 1) {
    stack--;
    nn[stack] += nn[stack+1];
   }
   break;
  case '-':
   if(stack > 1) {
    stack--;
    nn[stack] -= nn[stack+1];
   }
   break;
  case '*':
   if(stack > 1) {
    stack--;
    nn[stack] *= nn[stack+1];
   }
   break;
  case '/':
   if(stack > 1) {
    stack--;
    nn[stack] /= nn[stack+1];
   }
   break;
  case '%':
   if(stack > 1) {
    stack--;
    nn[stack] %= nn[stack+1];
   }
   break;
  case 'v':
   if(stack > 0) {
    printf("sqrt(%ld) = %f\n",
     nn[stack], sqrt((double)nn[stack]));
   }
   break;
  case '^':
   if(stack > 1) {
    stack--;
    num = 1L;
    for(i=0;i     nn[stack] = num;
    num = 0L;
   }
   break;
  case 'p':
   printf("nn[%02d]=%9ld\n",
    stack, nn[stack]);
   break;
  case 'd':
   if(stack > 0) {
    if(!overflow()) {
     stack++;
     nn[stack] = nn[stack-1];
    }
   }
   break;
  case 'f':
   for(i=1;i<=stack;i++) printf("nn[%02d]=%9ld\n",
    i, nn);
   num = 0L;
   for(i=1;i<=stack;i++) num += nn;
   printf("----------------\n");
   printf("sum   =%9ld\n", num);
   num = 0L;
   break;
  case 'c':
   stack = 0;
   break;
  case 's':
   nflag = 2;
   break;
  case 'l':
   nflag = 3;
   break;
  case '?':
   msg();
   break;
  case 'q':
   exit(0);
  }
}
}
overflow()
{
if(stack < MAXSTACK) return(0);
printf("\tStack over flow !\7\n");
return(-1);
}
msg()
{
printf("\n\n\
========= desk caculator =========\n\
0~9 push a number into stack\n\
+ add nn[stack] to nn[stack-1], stack = stack - 1;\n\
- sub\n\
* mult\n\
/ devide\n\
%c remain\n\
^ power\n\
v print sqrt(nn[stack])\n\
d duplicates\n\
p print last\n\
f print all & sum\n\
c clear\n\
sa~sz save into buffer\n\
la~lz load from buffer\n\
? print this message\n\
q quit\n\
=========== by Mike Wang ==========\n", '%');
回复

使用道具 举报

3#
发表于 2015-2-16 12:56:14 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-12-20 11:40

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表