最近遇到一个麻烦的事情,有些代码需要从网上下载,但是对方给出的代码页只能连每行的行数一块给复制下来,如下面这种模式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
23 #include <linux/module.h> 24 #include <linux/pci.h> 25 #include <linux/dmapool.h> 26 #include <linux/kernel.h> 27 #include <linux/delay.h> 109 #include "ehci.h" 110 #include "pci-quirks.h" 111 112 static void compute_tt_budget(u8 budget_table[EHCI_BANDWIDTH_SIZE], 113 struct ehci_tt *tt); 1211 * scheduling support 1212 */ 1213 .get_frame_number = ehci_get_frame, 1214 1215 /* 1216 * root hub support 1217 */ 1218 .hub_status_data = ehci_hub_status_data, 1219 .hub_control = ehci_hub_control, |
这样的代码复制过来肯定没法用的,好在Linux下有很多工具,而碰巧我还记得两个,于是就动手试试,首先说明一下用到的两个工具:colrm和cut:
colrm - column remove,顾名思义就是删除列,这个工具的用法如下
colrm [startcol] [endcol],亦即删除从sartcol开始到endcod结束的列,需要注意的是这个命令没有参数指定文件,只能通过 <file 重定向来输入内容
------------------
cut - cut,这就是它的全名,没有简写,它的作用是抽取指定的列,用法如下:
cut -c list [file...] ,这是默认的方式,抽取文件file中list指定的列,指定方式可以用范围如1-3或者列数如1,4,7
cut -f list [-d delimiter] [-s] [file...],这是通过指定定界符delimiter将file分割为多个fields并抽取list指定的field,有点类似awk中域的概念,其实也就是域的概念,不过这次不用它
------------------
如上就是两个命令的简单用法,现在我们就实际测试一下效果,首先是colrm:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[root@test tmp]# colrm 1 4 < test.c #include <linux/module.h> #include <linux/pci.h> #include <linux/dmapool.h> #include <linux/kernel.h> #include <linux/delay.h> #include "ehci.h" #include "pci-quirks.h" static void compute_tt_budget(u8 budget_table[EHCI_BANDWIDTH_SIZE], struct ehci_tt *tt); * scheduling support */ .get_frame_number = ehci_get_frame, /* * root hub support */ .hub_status_data = ehci_hub_status_data, .hub_control = ehci_hub_control, |
可以看到效果很好,就是我要的结果。但是这种方法有一个局限,就是删除列和需要的列要有对齐关,像这种 “右|左” 对齐方式,使用colrm就很方便处理,下面在看看cut的处理结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[root@test tmp]# cut -c 5-199 test.c #include <linux/module.h> #include <linux/pci.h> #include <linux/dmapool.h> #include <linux/kernel.h> #include <linux/delay.h> #include "ehci.h" #include "pci-quirks.h" static void compute_tt_budget(u8 budget_table[EHCI_BANDWIDTH_SIZE], struct ehci_tt *tt); * scheduling support */ .get_frame_number = ehci_get_frame, /* * root hub support */ .hub_status_data = ehci_hub_status_data, .hub_control = ehci_hub_control, |
输出效果也还可以,最关键的还是删除的列和所需的列有对齐关系,否则上面两个工具都难以对付那种杂乱无章的内容。网上有人介绍可以通过awk来实现,我觉得理论上也应该可以,毕竟“行数”和代码之间是有空格分隔的,但是由于awk已经忘的差不多了,所以暂且不去实践。
上面这段代码部分是从ehci-hcd.c里面粘帖过来的,这是linux kernel srouce中usb/driver下面的一个文件,根据网站上的显示,它的内核代码好像是使用一个叫做LXR的工具管理的,不清楚这个工具怎么用,好像很多人都是通过这个来管理内核源码。