Chinaunix
标题:
如何用sed删除从指定行一直到最后行所有的行
[打印本页]
作者:
bikkuri
时间:
2014-10-12 15:29
标题:
如何用sed删除从指定行一直到最后行所有的行
本帖最后由 bikkuri 于 2014-10-12 15:46 编辑
大家好!
我有一个问题向大家请教。
我想用sed删除某个文本文件中从指定行一直到最后所有的行。
以下是我的尝试。
root@sbox:/tmp/test# seq 10 > line
root@sbox:/tmp/test# cat line
1
2
3
4
5
6
7
8
9
10
root@sbox:/tmp/test# max=5
root@sbox:/tmp/test# echo $max
5
root@sbox:/tmp/test# sed -i '$max,$d' line
root@sbox:/tmp/test# cat line
1
2
3
4
5
6
7
8
9
10
root@sbox:/tmp/test# sed -i "$max,$d" line
root@sbox:/tmp/test# cat line
1
2
3
4
5
6
7
8
9
10
root@sbox:/tmp/test# sed -i '5,$d' line
root@sbox:/tmp/test# cat line
1
2
3
4
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
试出来了。
原来要用双引号。
root@sbox:/tmp/test# sed -i "$max"',$d' line
root@sbox:/tmp/test# cat line
1
2
3
4
root@sbox:/tmp/test#
复制代码
作者:
李满满
时间:
2014-10-12 16:28
学生党:嘿嘿~无聊用python模拟一下取行数
$ cat yhsafe.py
#!/usr/bin/env python
#-*- coding:gbk -*-
"just for fun for -just soso"
import sys
import fileinput
for x in fileinput.input(sys.argv[1]):
if fileinput.filelineno() in xrange(int(sys.argv[2]),int(sys.argv[3])+1):
print x,
复制代码
测试:
$ ./yhsafe.py yhsafe.txt 1 5
1
2
3
4
5
作者:
skypeGNU
时间:
2014-10-12 21:21
$ sed '$max,$d' testfile
sed: -e expression #1, char 2: unknown command: `m'
复制代码
首先,‘ ’ 是强引用,其中$是字面含义, 所以sed 看到的就是 '$max,$d', sed认为$是末行标识符,其后的m被认为是命令,由于sed没有m命令,所以报错。
$ sed "$max,$d" testfile
sed: -e expression #1, char 2: unexpected `,'
$ echo "$max,$d"
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
sed ''$max',$d'
复制代码
作者:
聆雨淋夜
时间:
2014-10-13 00:46
使用单引号就不能变量替换了
作者:
欧阳西风
时间:
2014-10-13 09:06
本帖最后由 欧阳西风 于 2014-10-13 09:08 编辑
单从这个命令来讲,其实没必要用引号,只需要保证传给sed的表达式是正确的就好了(zsh测试通过)
sed -i $max,\$d line
复制代码
刚刚试了下,bash下好像是不行的。看来还是需要引起来的。
作者:
jcdiy0601
时间:
2014-10-13 10:31
test=5
seq 10|sed ''$test',$d'
1
2
3
4
复制代码
作者:
edaplayer
时间:
2016-07-27 14:59
回复
10#
欧阳西风
seq 10 | sed $max,\$d
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2