在linux系统中,sed的文本处理无疑是一个非常强大的工具,用好sed可以使我们工作效率成倍提升,下面就小结一下sed的常用命令参数,只需关注常用的即可。
选项参数
首先来一发sed --help了解一下常用的参数
# sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
-n 忽略打印输出,一般是避免默认输出,只有我们处理的那一行文本会显示在屏幕上
-e 在命令行进行文本的处理动作
-f 后接脚本文件之类,类似于上面的-e参数,只是将执行的命令放到了一个指定的文件中
-i 修改文件内容
-c 当使用上面的-i参数修改文件内容时,为了防止修改错误,会自动生成一个和原始文件内容相同且以c结尾的备份文件
-l 后接数字,指定一行的长度
-r 使用正则表达式
命令参数
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(默认是偶数行,a前面可以指定行号)
c :替换, c 的后面可以接字符串,这些字符串会整行替换掉匹配的行。
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列号,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,常用的替换字符操作,如 ‘s/aa/bb/g’ ,用于替换匹配的字符。
示例:
1
|
# a 新增
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
[root@localhost ~]
# sed '3axxxxx' t
1
2
3
xxxxx
#在第三行后增加指定内容
4
5
[root@localhost ~]
# sed '2,4axxxxx' t
1
2
xxxxx
#在2-4行后每行增加指定内容
3
xxxxx
4
xxxxx
5
# c 替换某一行内容,可以指定行号,也可以匹配内容
[root@localhost ~]
# for n in {1..6};do echo "aa$n" >>test.txt;done
[root@localhost ~]
# sed '2cxxxxx' test.txt
aa1
xxxxx
#替换掉指定行的内容
aa3
aa4
aa5
aa6
[root@localhost ~]
# sed '2,5cxxxxx' test.txt
aa1
xxxxx
#替换多行
aa6
[root@localhost ~]
# sed '/aa3/cxxxxx' test.txt
aa1
aa2
xxxxx
#指定内容匹配替换
aa4
aa5
aa6
# d 删除,可以匹配行号或者内容
[root@localhost ~]
# sed 3,5d test.txt
aa1
aa2
#删除3-5行的内容
aa6
[root@localhost ~]
# sed /aa5/d test.txt
aa1
aa2
aa3
aa4
aa6
# i 插入内容
[root@localhost ~]
# sed '2ixxxxx' test.txt
aa1
xxxxx
#在第二行之前插入指定内容
aa2
aa3
aa4
aa5
aa6
[root@localhost ~]
# sed '3,5ixxxxx' test.txt
aa1
aa2
xxxxx
# 3-5行每行前插入指定内容
aa3
xxxxx
aa4
xxxxx
aa5
aa6
# p 打印输出指定的行或内容,不加参数-n会多出一个全局输出
[root@host6 ~]
# sed -n 2p aaa.txt
aabb2
[root@host6 ~]
# sed -n 2,4p aaa.txt
aabb2
aabb3
aabb4
[root@host6 ~]
# sed -n /aabb3/p aaa.txt
aabb3
# s 取代匹配的字符
[root@host6 ~]
# sed s/bb3/xx3/ aaa.txt
aabb1
aabb2
aaxx3
#替换指定内容
aabb4
aabb5
aabb6
|
除了上面的这一些最基础的用法外,sed 还支持跟加复杂的高级匹配,支持正则,变量和多个匹配字符(address)的匹配。
sed 指定行范围内匹配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
[root@host6~]
# sed -i '1, /test/ s#123#888#g' test.txt
[root@host6~]
# cat test.txt
test
888
test
888
test
123
test
123
#适合多次过滤匹配,用于筛选条件较多的场景
[root@host6 ~]
# cat test.txt
aabb111
aacc222
bbdd111
bbcc222
zzaa333
eevv111
bbcc222111cvcv
[root@host6 ~]
# sed '/^bb/ s/222/000/' test.txt
aabb111
aacc222
bbdd111
bbcc000
zzaa333
eevv111
bbcc000111cvcv
#匹配第六行后三行,符合条件的文本内容
[root@host6 ~]
# sed '6,/^bb/ s/222/000/' test.txt
aabb111
aacc222
bbdd111
bbcc222
zzaa333
eevv111
bbcc000111cvcv
|
sed中引用shell变量的四种方法
在使用sed引用变量时可能会出现不成功的情况,下面这些规则能让我们更好的使用sed变量
eval sed ’s/$a/$b/’ filename
sed "s/$a/$b/" filename
sed ’s/’$a’/’$b’/’ filename
sed s/$a/$b/ filename
简单正则匹配字符的方法
$表示匹配结尾,^ 表示匹配开头, &表示前面匹配的内容,= 表示输出行号。
'/\.$/d' 删除以句点结尾行
's/[[:space:]]/ /' 删除一个以上空格,用一个空格代替
'/^[[:space:]]/d' 删除行首空格
's/[[:space:]]\+//' 删除空格
'/^$/d' 删除空行
's/^.//' 删除第一个字符,包括空格
以上只是sed的一些基础用法,在实际应用中一般都比这个复杂。
本文转自 酥心糖 51CTO博客,原文链接:http://blog.51cto.com/tryingstuff/1839867