Chinaunix

标题: 如何用sed删除从指定行一直到最后行所有的行 [打印本页]

作者: bikkuri    时间: 2014-10-12 15:29
标题: 如何用sed删除从指定行一直到最后行所有的行
本帖最后由 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却没有效果呢?

谢谢。
作者: 柠檬精铃    时间: 2014-10-12 15:37


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

作者: bikkuri    时间: 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#
复制代码

作者: 李满满    时间: 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

作者: skypeGNU    时间: 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 机制, 第一次回帖,不知道说清楚没。。。
作者: prcardin    时间: 2014-10-12 23:03
欢迎大婶多回帖,回归CU大家庭
回复 5# skypeGNU


   
作者: bikkuri    时间: 2014-10-13 00:06
谢谢您的解释!这下完全明白了!

回复 5# skypeGNU


   
作者: yestreenstars    时间: 2014-10-13 00:08
  1. sed ''$max',$d'
复制代码

作者: 聆雨淋夜    时间: 2014-10-13 00:46
使用单引号就不能变量替换了
作者: 欧阳西风    时间: 2014-10-13 09:06
本帖最后由 欧阳西风 于 2014-10-13 09:08 编辑

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

  1. sed -i $max,\$d line
复制代码
刚刚试了下,bash下好像是不行的。看来还是需要引起来的。
作者: jcdiy0601    时间: 2014-10-13 10:31
  1. test=5
  2. seq 10|sed ''$test',$d'   
  3. 1
  4. 2
  5. 3
  6. 4
复制代码

作者: edaplayer    时间: 2016-07-27 14:59
回复 10# 欧阳西风


    seq 10 | sed  $max,\$d




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2