本站页面顶部导航栏右侧随机输出的Linux命令是通过Javascript实现的,该.js文件的大致内容如下:

  1 tips = new Array();
  2 code = new Array();
  3 tips[0] = '查看软件xxx安装内容';
  4 code[0] = 'dpkg -L xxx';
  5 tips[1] = '查找软件库中的软件';
  6 code[1] = 'apt-cache search 正则表达式';
    ......
239 tips[119]="将文件中第3行就地\"正法\"";
240 code[119]="sed -i '3d' file";
241
242 index = Math.floor(Math.random() * tips.length);
243 document.write(tips[index-1]+": "+code[index-1]);

  这两个数组tips[]、code[]的索引是向下递增的,每次向里面添加新项时都要用鼠标向下拖动,很麻烦。虽然语法上也允许在tips[0]上方直接添加tips[120],但视觉上总觉得别扭……呃,好吧,我想说的是,我想把从第三行到第240行颠倒一下,看起来像这样:

  1 tips = new Array();
  2 code = new Array();
  3 code[119]="sed -i '3d' file";
  4 tips[119]="将文件中第3行就地\"正法\"";
  5 code[118]="dd if=/dev/sda of=MBR_bak bs=512 count=1";
  6 tips[118]="备份MBR";
    ......
239 code[0] = 'dpkg -L xxx';
240 tips[0] = '查看软件xxx安装内容';
241
242 index = Math.floor(Math.random() * tips.length);
243 document.write(tips[index-1]+": "+code[index-1]);

  当然,我不会一行行的粘贴复制。有一个叫做的tac的命令似乎能完成这个工作,但它只能将整个文件反转。更好的选择是sed:

sed  -e '4,240G;3,240h;3,239d' sample.js > reverse.js

  这样就搞定了!
  简单解释一下。sed内部维护着两个缓冲区,模式缓冲和保留缓冲。通常,sed每每从文件读入一行就放入模式缓冲,由-e选项指定的各个命令依次处理这个缓冲内的文本,所有命令都执行完后,sed就把模式缓冲的内容输出的标准输出(如果没有指定-n选项的话)。保留缓冲是一个由用户显式使用的缓冲区。-e ’4,240G;3,240h;3,239d’中,G将保留缓冲取的内容附加到(append)模式缓冲,h将模式缓冲复制(copy)到保留缓冲,d将模式缓冲区的内容清除,各个命令前由逗号分割的数字指名了后面的命令在哪些行上执行,各命令由分号进行分割。
  具体地:

  1. 1、2行被读入(模式缓冲)时,-e列出各命令都没有动作,直接输出;
  2. 第3行被读入时,G不执行,h将该行复制到保留缓冲,d将模式缓冲清除,没有输出;
  3. 第4行被读入模式缓冲,然后G将保留缓冲的内容(第三行)附加到模式缓冲,h又将模式缓冲复制到保留缓冲,d又将模式缓冲清除,没有输出;
  4. 重复3,直到第239行;
  5. 第240行被读入,G将第239到3行附加到第240行后面,h又将其复制到保留缓冲,d不执行,240到3行被输出;
  6. 241到243行被原样输出,至此,3~240行被反转

over

Tags: ,,.
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
Home

Be the first to comment on this entry.

Name(required)
Mail (required),(will not be published)

RFC: Request For Comments. Orz..

Website(recommended)