免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 16621 | 回复: 11
打印 上一主题 下一主题

[文本处理] 如何用sed删除从指定行一直到最后行所有的行 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-12 15:29 |只看该作者 |倒序浏览
本帖最后由 bikkuri 于 2014-10-12 15:46 编辑

大家好!
我有一个问题向大家请教。
我想用sed删除某个文本文件中从指定行一直到最后所有的行。
以下是我的尝试。
  1. root@sbox:/tmp/test# seq 10 > line
  2. root@sbox:/tmp/test# cat line
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. 8
  11. 9
  12. 10
  13. root@sbox:/tmp/test# max=5
  14. root@sbox:/tmp/test# echo $max
  15. 5
  16. root@sbox:/tmp/test# sed -i '$max,$d' line
  17. root@sbox:/tmp/test# cat line
  18. 1
  19. 2
  20. 3
  21. 4
  22. 5
  23. 6
  24. 7
  25. 8
  26. 9
  27. 10
  28. root@sbox:/tmp/test# sed -i "$max,$d" line
  29. root@sbox:/tmp/test# cat line
  30. 1
  31. 2
  32. 3
  33. 4
  34. 5
  35. 6
  36. 7
  37. 8
  38. 9
  39. 10
  40. root@sbox:/tmp/test# sed -i '5,$d' line
  41. root@sbox:/tmp/test# cat line
  42. 1
  43. 2
  44. 3
  45. 4
  46. root@sbox:/tmp/test#
复制代码
我想问一下为什么用sed -i '5,$d' line可以删除从第五行一直到最后的行,但是用sed -i '$max,$d' line却没有效果呢?

谢谢。

论坛徽章:
0
2 [报告]
发表于 2014-10-12 15:37 |只看该作者


除了默默点个赞,我真的不知道说啥好了

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
3 [报告]
发表于 2014-10-12 15:49 |只看该作者
试出来了。
原来要用双引号。
  1. root@sbox:/tmp/test# sed -i "$max"',$d' line
  2. root@sbox:/tmp/test# cat line
  3. 1
  4. 2
  5. 3
  6. 4
  7. root@sbox:/tmp/test#
复制代码

论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
4 [报告]
发表于 2014-10-12 16:28 |只看该作者
学生党:嘿嘿~无聊用python模拟一下取行数

  1. $ cat yhsafe.py
  2. #!/usr/bin/env python
  3. #-*- coding:gbk -*-
  4. "just for fun for -just soso"

  5. import sys
  6. import fileinput

  7. for x in fileinput.input(sys.argv[1]):
  8.         if fileinput.filelineno() in xrange(int(sys.argv[2]),int(sys.argv[3])+1):
  9.                 print x,
复制代码
测试:
$ ./yhsafe.py yhsafe.txt 1 5
1
2
3
4
5

论坛徽章:
0
5 [报告]
发表于 2014-10-12 21:21 |只看该作者
  1. $ sed '$max,$d' testfile
  2. sed: -e expression #1, char 2: unknown command: `m'
复制代码
首先,‘ ’ 是强引用,其中$是字面含义, 所以sed 看到的就是 '$max,$d', sed认为$是末行标识符,其后的m被认为是命令,由于sed没有m命令,所以报错。
  1. $ sed "$max,$d" testfile
  2. sed: -e expression #1, char 2: unexpected `,'
  3. $ echo "$max,$d"
  4. 5,
复制代码
“ ” 是弱引用,$ 可以进行变量扩展, 所以 $max  扩展为 5;由于 d事先没有声明,所以$d 扩展为 empty
那么最终, sed 看到的是 '5,' , 所以报错

建议你,看看 shell 的 quoting 机制, 第一次回帖,不知道说清楚没。。。

论坛徽章:
8
戌狗
日期:2013-10-12 11:37:19双子座
日期:2014-05-06 14:40:39巨蟹座
日期:2014-06-14 09:22:18戌狗
日期:2014-09-18 16:05:44巨蟹座
日期:2014-12-27 16:37:26酉鸡
日期:2015-01-20 18:39:022015年亚洲杯之沙特阿拉伯
日期:2015-04-20 22:38:242015亚冠之萨济拖拉机
日期:2015-06-19 16:01:03
6 [报告]
发表于 2014-10-12 23:03 |只看该作者
欢迎大婶多回帖,回归CU大家庭
回复 5# skypeGNU


   

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
7 [报告]
发表于 2014-10-13 00:06 |只看该作者
谢谢您的解释!这下完全明白了!

回复 5# skypeGNU


   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
8 [报告]
发表于 2014-10-13 00:08 |只看该作者
  1. sed ''$max',$d'
复制代码

论坛徽章:
22
处女座
日期:2014-10-11 13:33:292015亚冠之塔什干火车头
日期:2015-07-20 19:59:042015亚冠之塔什干火车头
日期:2015-07-26 10:59:31程序设计版块每日发帖之星
日期:2015-08-05 06:20:00每日论坛发贴之星
日期:2015-08-05 06:20:00程序设计版块每日发帖之星
日期:2015-08-07 06:20:00每日论坛发贴之星
日期:2015-08-07 06:20:002015亚冠之阿尔纳斯尔
日期:2015-10-01 15:23:28白银圣斗士
日期:2015-12-07 17:17:06操作系统版块每日发帖之星
日期:2015-12-27 06:20:002015亚冠之广州富力
日期:2015-07-08 15:48:31程序设计版块每日发帖之星
日期:2015-06-11 22:20:00
9 [报告]
发表于 2014-10-13 00:46 |只看该作者
使用单引号就不能变量替换了

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
10 [报告]
发表于 2014-10-13 09:06 |只看该作者
本帖最后由 欧阳西风 于 2014-10-13 09:08 编辑

单从这个命令来讲,其实没必要用引号,只需要保证传给sed的表达式是正确的就好了(zsh测试通过)

  1. sed -i $max,\$d line
复制代码
刚刚试了下,bash下好像是不行的。看来还是需要引起来的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP