LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 760|回复: 9

如何简化sed语句?

[复制链接]
发表于 2010-4-9 13:43:35 | 显示全部楼层 |阅读模式
假定目标文件:
sed.txt:
sdgdsggg
1require 'rubygems'
2require 'hpricot'
3require 'open-uri'
4doc = Hpricot(open('http://www.google.com/search?q=ruby'))
50links = doc/"//a[@class=l]"
60links.map.each {|link| puts link.attributes['href']}
最后两行的前两个,分别是:50\60
我如何得到这样的文件:
sed1.txt
sdgdsggg
require 'rubygems'
require 'hpricot'
require 'open-uri'
doc = Hpricot(open('http://www.google.com/search?q=ruby'))
links = doc/"//a[@class=l]"
links.map.each {|link| puts link.attributes['href']}

我通过下面的两条命令得到了结果:
pt@pt-laptop:sed -n '1p' sed.txt >> sed1.txt
pt@pt-laptop:~$ sed -n '2,$p' sed.txt | sed s/^[0-9]*[0-9]//g >> sed1.txt
个人感觉太臃肿,可否写成一条sed语句??
发表于 2010-4-9 14:07:46 | 显示全部楼层
  1. sed 's/^[0-9]*\(.*\)/\1/' sed.txt
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-4-9 14:56:09 | 显示全部楼层
sed 's/^[0-9]*//' sed.txt
  1. imghchco [ ~/tmp ]0$ cat sed.txt
  2. sdgdsggg
  3. 1require 'rubygems'
  4. 2require 'hpricot'
  5. 3require 'open-uri'
  6. 4doc = Hpricot(open('http://www.google.com/search?q=ruby'))
  7. 50links = doc/"//a[@class=l]"
  8. 60links.map.each {|link| puts link.attributes['href']}
  9. imghchco [ ~/tmp ]0$ sed 's/^[0-9]*//' sed.txt
  10. sdgdsggg
  11. require 'rubygems'
  12. require 'hpricot'
  13. require 'open-uri'
  14. doc = Hpricot(open('http://www.google.com/search?q=ruby'))
  15. links = doc/"//a[@class=l]"
  16. links.map.each {|link| puts link.attributes['href']}
  17. imghchco [ ~/tmp ]0$
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-9 16:40:02 | 显示全部楼层
拜读您的帖子,知道我的正则表达还可以继续简化,我的本意是,如果一个文档需要提取第一行,同时对后面的几行进行操作,可否用一行来表达,
具体一点说:
假定我的目标文件是
100sdgdsggg
1require 'rubygems'
2require 'hpricot'
3require 'open-uri'
4doc = Hpricot(open('http://www.google.com/search?q=ruby'))
50links = doc/"//a[@class=l]"
60links.map.each {|link| puts link.attributes['href']}
我需要得到
100sdgdsggg
require 'rubygems'
require 'hpricot'
require 'open-uri'
doc = Hpricot(open('http://www.google.com/search?q=ruby'))
links = doc/"//a[@class=l]"
links.map.each {|link| puts link.attributes['href']}
也就是,需要表达,第一行原封不懂,第二行到文档结束,去掉前面的数字(一位或者两位)
可以用两句话实现
pt@pt-laptop:~$ sed -n '1p' /home/pt/test/sed.txt
100sdgdsggg
pt@pt-laptop:~$ sed -n '2,$p' /home/pt/test/sed.txt
1require 'rubygems'
2require 'hpricot'
3require 'open-uri'
4doc = Hpricot(open('http://www.google.com/search?q=ruby'))
50links = doc/"//a[@class=l]"
60links.map.each {|link| puts link.attributes['href']}
这两个命令可否合并为一句话??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-9 16:43:55 | 显示全部楼层
sed -n '1p' /home/pt/test/sed.txt >> /home/pt/test/sed1.txt
pt@pt-laptop:~$ sed -n '2,$p' /home/pt/test/sed.txt | sed s/^[0-9]*//g >> /home/pt/test/sed1.txt

不好意思,应该是这两句。
回复 支持 反对

使用道具 举报

发表于 2010-4-9 17:20:11 | 显示全部楼层
sed '2,$s/^[0-9]*//' sed.txt
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-9 18:07:20 | 显示全部楼层
测试通过:        
sed '2,$s/^[0-9]*//' sed.txt
第一行他会自动输出,
如果我不要第一行,只要从第二行到文档结尾的处理结果,应该增加什么呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-9 18:12:26 | 显示全部楼层
我想出来这个做法:sed -n  '2,$p' sed.txt   | sed 's/^[0-9]*//'
测试通过,有无更简洁的方法?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-9 18:15:31 | 显示全部楼层
感觉,这种写法
sed -n '2,$p' sed.txt | sed 's/^[0-9]*//'
有点笨拙,可否优化??
回复 支持 反对

使用道具 举报

发表于 2010-4-9 20:32:33 | 显示全部楼层
sed -n '2,$s/^[0-9]*//p' sed.txt
回复 支持 反对

使用道具 举报

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

本版积分规则

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