一些操作实例
流编辑器sed是著名的 unix 实用程序,其功能非常强大,用法非常灵活,这里是一些生活中用到的实例,供参考。 本页当前内容包括:
Have fun! | 使用sed处理多行数据这个例子来源于2006年11月7日北邮BBS真情流露Linux版的一个网友hero的问题,具体叙述是这样的: 数据文件txt: 一列,N行. 现在要把前m行摊开,剩下的依次跟上,另外保证精度不变。 比如8行: 现在,我使用 sed来实现这个功能,当然,题目有点不清楚,不知是只处理前m行,还是每m行处理一次,前者似乎正是题目描述的,虽然后者更像真的。不过,我们都实现一下。我的解决方案似乎不是很精巧,不过确实有效。 首先科普两个sed概念:
有了这两个概念,下面讲着就不费劲了。 只处理前m行以 t 为你的测试数据文件,如果你只想以第m行为分隔输出的话,假设m为4 ~$ sed -ne 'H;1h;4{x;s/\n/\ /gp};5h;${x;s/\n/\ /gp}' t 这个处理的思路是,每次都把当前行放到 hold space 中去,到了第m行或最后一行,一起取出来打印,中间有一点小波折,就显得比较长,是这样的:
此外,关于 sed 的选项开关, -n 是没有明确指示(p)不输出,-e 就是执行后面的匹配操作 继续测试,假设m为3 ~$ sed -ne 'H;1h;3{x;s/\n/\ /gp};4h;${x;s/\n/\ /gp}' t 看来m不是4也可以 :) 每隔m行处理一次如果你想以m的倍数分隔,假设m为4 ~$ sed -ne 'H;1h;4~4{x;s/\n/\ /gp};5~4h;${x;s/\n/\ /gp}' t 这里仅有两处需要追加解释的:
下面测试,假设m为3 ~$ sed -ne 'H;1h;3~3{x;s/\n/\ /gp};4~3h;${x;s/\n/\ /gp}' t 证明 N/m 有余数也是可以的 ~$ sed -ne 'H;1h;2~2{x;s/\n/\ /gp};3~2h;${x;s/\n/\ /gp}' t 证明 N 是 m 的大于2的整数倍 (N/m=4) 也是可以的。 大家可以考虑优化一下处理 :P 从文件中提取代理服务器信息原始数据中包含若干 nn.nnn.nn.nnn:pp@HTTP 这样的信息,当然,一行可能有多个,也可能只有一个,现在要提取出来其中的代理信息,变成每行一个, nn.nnn.nn.nnn:pp的形式。 首先 sed -e 's/\@HTTP/\n/g' 确保每行一个,然后 sed -n -e 's/.*[^0-9]\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\) 提取地址,并输出。 |